Ошибка с mallo c при создании памяти для списка структурных указателей - PullRequest
0 голосов
/ 31 марта 2020

По какой-то причине, пытаясь создать массив указателей структуры с именем Node, я получаю сообщение об ошибке:

Node ret[2] = (struct Node*)malloc(2*sizeof(Node));
error: invalid initializer

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

3 голосов
/ 31 марта 2020
Node ret[2] = (struct Node*)malloc(2*sizeof(Node));

, вероятно, должно быть:

Node *ret = malloc(2 * sizeof(*ret));

Это потому, что вам нужен указатель на память, а не массив. В случае массива это инициализация, для которой потребуется ограниченный список инициализации. Обратите внимание, что это обеспечивает память только для указателей, , а не для того, на что они указывают - их нужно выделять отдельно, если вы будете sh использовать их.

Вы, вероятно, заметите также два других изменения:

  • Я удалил приведение к возвращаемому значению malloc. Это не имеет смысла в C, поскольку возвращаемый void* может быть неявно приведен к другим типам указателей. Фактически, существуют ситуации, когда явное приведение может привести к незначительным проблемам.

  • Я использовал *ret в качестве переменной, чтобы получить размер, а не тип. Это просто моя привычка, поэтому, если я изменяю тип (например) tNode, мне нужно изменить его только в одном месте в этой строке - да, я в основном ленив :-) Обратите внимание, что это просто предпочтение, выполнение оригинального способа не оказывает вредного влияния на саму программу, только сопровождение разработчика.

1 голос
/ 31 марта 2020

Я думаю, что ваша структура typedef ed

Node ret[2]  = ( struct Node* ) malloc( 2 * sizeof(Node) );

это должно быть

Node *rec[2] = { malloc(sizeof(Node)) , malloc(sizeof(Node)) };

или

Node *rec    =  malloc(2*sizeof(Node));    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...