Почему я не могу присвоить значения элементам массива?

#c #pointers #types

Вопрос:

В этой C-программе:

 #include <stdlib.h>

struct mystruct
{};

int
main()
{
  struct mystruct* obj = malloc(sizeof(struct mystruct));
  struct mystruct(*list)[10];
  list[0] = obj;
}
 

В принципе, я пытаюсь создать массив указателей фиксированного размера (которые указывают на некоторую структуру).

Последняя строка main приводит к ошибке «выражение должно быть изменяемым значением lvalue». Но почему?

Я знаю, что вам запрещено назначать массивы, но я не хочу назначать массив, я хочу назначить указатель.

Комментарии:

1. list[0] представляет собой массив, массив из struct mystruct . Попробуйте list[0][0] = *obj; назначить первый элемент массива.

2. «для создания массива указателей фиксированного размера» — > > struct mystruct *list_alt[10]; имеет больше смысла.

3. @chux-RestorateMonica list[0][0] = … будет писать через неинициализированный указатель.

Ответ №1:

Я пытаюсь создать массив указателей фиксированного размера

Но это не так: вы создаете указатель на массив структур фиксированного размера. Вы можете использовать cdecl, чтобы помочь вам с синтаксисом сложных типов.

 cdecl> explain struct mystruct(*list)[10];
declare list as pointer to array 10 of struct mystruct
cdecl> explain struct mystruct *list[10];
declare list as array 10 of pointer to struct mystruct
 

Сообщения об ошибках от GCC и Clang более понятны, чем ваш компилятор. Рассмотрите возможность использования нескольких компиляторов, чтобы получить больше отзывов о вашем коде.

 % gcc -Wall -O a.c
a.c: In function ‘main’:
a.c:11:11: error: assignment to expression with array type
   11 |   list[0] = obj;
      |           ^
$ clang -Wall -O a.c
a.c:11:11: error: array type 'struct mystruct [10]' is not assignable
  list[0] = obj;
  ~~~~~~~ ^
1 error generated.
 

Ответ №2:

 struct mystruct (*list)[10];
 

создает list как указатель на массив из 10 элементов struct mystruct . Чего ты хочешь, так это

 struct mystruct *list[10];
 

который создает list массив из 10 элементов указателей на struct mystruct . Эти скобки полностью меняют значение. Теперь ваш

 list[0] = obj;
 

заявление должно сработать.