@elBroom

Почему возникает ошибка incompatible types when assigning to type?

ошибка:
error: incompatible types when assigning to type ‘struct Item[100]’ from type ‘struct Item *’
table = fizz(table);

Код:
#define SIZE 100
struct Item{
	int key;
	int val;
};

struct Item * fizz(struct Item *table){
	return table;
}

int main(){
	struct Item table[SIZE];
	table = fizz(table);
}


Компилятор:
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

Вопрос про C.

Почему при передаче table в fizz struct Item[100] преобразуется в struct Item *table, а при присваивании - нет? Как исправить ошибку?

ideone.com/uBPnhE
  • Вопрос задан
  • 3599 просмотров
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
table = fizz(table);

Что сделать-то хотел?
Если проинициализировать массив значением которое вернула fizz, нужно было просто проинициализировать его в этой функции.
Если поменять область памяти на которую указывает table, то нужно было сделать table указателем.

Почему при передаче table в fizz struct Item[100] преобразуется в struct Item *table, а при присваивании - нет?

Потому что массив -- это синтаксис для статического выделения памяти на стеке, в области данных или в структурах. Имя массива -- это имя этого блока памяти, а его адрес -- адрес этого блока. Поэтому имя массива можно легко сконвертировать в адрес. Но если бы язык давал возможность менять адрес массива с помощью присваивания его имени, массив помимо своих элементов должен бы был содержать дополнительный указатель. Получился бы странный, сложный класс объектов, соединяющий в себе свойства массива и указателя. Поскольку язык С -- простой язык, у вас есть отдельно массивы и отдельно указатели, а сложный тип можно сделать самому.
Ответ написан
Комментировать
@sitev_ru
sitev.ru - мой блог ...
@Alexander1705
Потому, что нельзя присваивать массивы. Такой стандарт. Считайте, что массив - это константный указатель. Его можно скопировать, но нельзя изменить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы