使用指向指针的Realloc行为

时间:2015-01-23 18:28:11

标签: c list pointers realloc

我不明白为什么在运行此代码时,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

进行了操作

2 个答案:

答案 0 :(得分:2)

不仅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()

的结果

答案 1 :(得分:-1)

您的代码相对破碎。这是一个相当理智的方式:

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()是否返回非空指针。