#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;
заявление должно сработать.