我不明白为什么在运行此代码时,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
答案 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()
是否返回非空指针。