【问题标题】:Realloc behaviour using a pointer-to-pointer使用指针到指针的 Realloc 行为
【发布时间】:2015-01-23 18:28:11
【问题描述】:

我不明白为什么当我运行此代码时,printf 语句不起作用。 代码如下:

typedef struct list {
    int n;
    struct list *next;
}List;

List **head;


List *tmp=malloc(sizeof(List));
tmp->n=34;
tmp->next=NULL;
List *tmp2=malloc(sizeof(List));
tmp2->n=45;
tmp2->next=NULL;
List *tmp3=malloc(sizeof(List));
tmp3->n=26;
tmp3->next=NULL;


head=malloc(sizeof(head));
head[0]=tmp;
head[1]=tmp2;
head=realloc(head,sizeof(head));
head[2]=tmp3;
printf("n of tmp:%d \n",head[0][0].n);
printf("n of tmp2:%d \n",head[1][0].n);
printf("n of tmp3:%d \n",head[2][0].n);

我认为原因可能是realloc,但为什么呢?我正在正确使用它,不是吗?我已经按照这个教程http://www.tutorialspoint.com/c_standard_library/c_function_realloc.htm

【问题讨论】:

    标签: c list pointers realloc


    【解决方案1】:

    不只是realloc,这里

    head = malloc(sizeof(head));
    

    你只为一个指针分配空间,然后

    head[0]=tmp;
    head[1]=tmp2;
    

    你尝试存储 2。

    如果你需要2个指针的空间,那么正确的方法是

    head = malloc(2 * sizeof(*head));
        /*                   ^ always dereference when using sizeof */
        /* in this case it's not a problem, but in other cases it will be */
    

    那么就可以填充这两个元素了,检查malloc()的返回值之后就可以了

    head = malloc(2 * sizeof(*head));
    if (head == NULL)
        doSomething_But_DontDereference_head_mayBe_exit();
    head[0] = tmp;
    head[0] = tmp2;
    

    现在,realloc(),如果 realloc() 返回 NULL,而你已经覆盖了 head 指针,现在你不能用它做任何其他事情,所以

    void *pointer;
    
    pointer = realloc(head, 3 * sizeof(*head));
    if (pointer == NULL)
        doSomethingAndProbablyFree_head_and_abort();
    head = pointer;
    

    更安全。

    另外,请注意,您需要将指针 sizeof(*head) 的大小乘以要存储的指针数量。

    始终检查malloc()的结果

    【讨论】:

      【解决方案2】:

      你的代码比较破。这是一个相当理智的方法:

      typedef struct list {
          int n;
          struct list *next;
      } List;
      
      int main() {
          List *tmp1 = malloc(sizeof(List));
          tmp1->n = 34;
          tmp1->next = NULL;
      
          List *tmp2 = malloc(sizeof(List));
          tmp2->n = 45;
          tmp2->next = NULL;
      
          List *tmp3 = malloc(sizeof(List));
          tmp3->n = 26;
          tmp3->next = NULL;
      
          List **head = malloc(2 * sizeof(List *));
          head[0] = tmp1;
          head[1] = tmp2;
          head = realloc(head, 3 * sizeof(List *));
          head[2] = tmp3;
      
          printf("n of tmp1: %d\n", head[0]->n);
          printf("n of tmp2: %d\n", head[1]->n);
          printf("n of tmp3: %d\n", head[2]->n);
      }
      

      我没有包括这个,但你也应该验证malloc()realloc() 返回一个非空指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 2018-01-23
        • 2013-03-21
        相关资源
        最近更新 更多