Что вызывает ошибку «адрес магазина с недостаточным пространством»? - PullRequest
0 голосов
/ 06 марта 2020
    struct ListNode {
        int val;
        struct ListNode *next;
    };


   struct ListNode* test = malloc(sizeof(struct ListNode*));

   test->val = 6;

   struct ListNode* lex = malloc(sizeof(struct ListNode*));

   test->next = lex;

   return test;

В этот момент я должен получить заполненную структуру. Вместо этого я получаю это:

   Line 14: Char 18: runtime                                                    
   error: store to address   
   0x602000000118 with      
   insufficient space for an 
   object of type 'struct ListNode 
   *' (solution.c)


   0x602000000118: note: pointer   
   points here

   be be be be  00 00 00 00 00 00 
   00 00  02 00 00 00 ff ff ff 02  
   08 00 00 20 01 00 80 70  be be 
   be be

Что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 06 марта 2020

Вы выделяете место только для указателя ListNode, а не фактического ListNode.

try: struct ListNode* test = malloc(sizeof(struct ListNode));

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

Давайте посмотрим на эту строку кода:

struct ListNode* test = malloc(sizeof(struct ListNode*));

Указатель test хочет указать на блок памяти, достаточно большой для того, чтобы держать фактическое честное отношение к совершенству struct ListNode объект. У этого объекта есть целое число и указатель.

Однако, ваш вызов malloc говорит: «Пожалуйста, дайте мне достаточно места для хранения указателя на struct ListNode объекте». Недостаточно памяти для хранения struct ListNode, отсюда и ошибка.

Один из способов исправить это - удалить звездочку из struct ListNode в вашем вызове sizeof:

struct ListNode* test = malloc(sizeof(struct ListNode));

Другой вариант, который довольно симпатичен, заключается в использовании этого подхода:

struct ListNode* test = malloc(sizeof *test);

Это говорит о том, что «количество места, которое мне нужно, это количество пространства, на которое объект, на который указывает test, будет требуют «. Это бывает sizeof (struct ListNode), и нет необходимости печатать тип с помощью этого второго подхода.

Как примечание, ошибка, которую вы получаете, является ошибкой runtime , а не ошибка компилятора . Код, который у вас есть, является допустимым C кодом, но просто не будет работать при запуске программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...