是什么导致此“存储空间不足的地址”错误?

问题描述 投票:0回答:2
    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

这是怎么回事?

c pointers malloc sizeof
2个回答
2
投票

您仅为ListNode指针分配空间,而不为实际的ListNode分配空间。

尝试:struct ListNode* test = malloc(sizeof(struct ListNode));


1
投票

让我们看一下这段代码:

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

指针test希望指向一个足以容纳实际的诚实struct ListNode对象的内存块。该对象中有一个整数和一个指针。

但是,您对malloc的呼叫是“请给我足够的空间来将pointer存储到struct ListNode对象”。内存不足,无法容纳struct ListNode,因此会出现错误。

解决此问题的一种方法是在struct ListNode通话中从sizeof中删除星星:

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

另一个很可爱的选择是使用这种方法:

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

这表示“我需要的空间量是test指向的对象将需要的空间量。”碰巧是sizeof (struct ListNode),不需要使用第二种方法键入类型。

注意,您得到的错误是运行时错误,而不是compiler错误。您拥有的代码是合法的C代码,但在运行程序时将无法使用。

© www.soinside.com 2019 - 2024. All rights reserved.