C realloc()函数失败

时间:2013-09-15 14:57:42

标签: c realloc

为什么这段代码不起作用?

char *x=malloc(100);
x++;
x=realloc(x, 200);

我的意思是x是一个有效的字符串指针,只增加一个?

4 个答案:

答案 0 :(得分:7)

参见realloc上的C标准(C99,7.20.3.4p3)和我的重点:

  

void * realloc(void * ptr,size_t size);

     

如果ptr是空指针,则realloc函数的行为类似于malloc函数   指定大小。否则,如果ptr与先前返回的指针不匹配   calloc,malloc或realloc函数,或者如果空间已被呼叫解除分配   对于free或realloc函数,行为未定义

在您的情况下,x返回了malloc,而不是x + 1。所以你的程序会调用未定义的行为。

答案 1 :(得分:2)

char *x=malloc(100);
x++;
x=realloc(x, 200);

在上面显示的代码中,指针x指向的地址在调用realloc()函数之前发生了变化。这是 C 中未定义的行为。

答案 2 :(得分:2)

考虑一下realloc的作用。当free实际在地址x+1创建指针时,如何malloc地址x处的指针?

更具体地说,假设您在地址0x1000处分配了100个字节。现在x递增,指向0x1001。然后在新地址拨打realloc。由于malloccallocrealloc都没有创建0x1001,因此调用free所使用的realloc(或等效代码)不知道该怎么做任何有0x1001的东西;它甚至无法理解它占用多少字节的内存。它只知道0x1000处的100个字节。

malloc和朋友实现背后的基本思想是跟踪指定的指针和分配的字节数。然后,当稍后调用free时,将查找传递给free的指针。如果没有对传递给free的指针的引用,除了崩溃还有什么可做的?对我来说,这比假设你可以继续使用可能有效或无效的指针更符合逻辑。

答案 3 :(得分:1)

如果你认为你从undefined behavior获得了一个错误的指针,那么这是malloc()

显然,x已返回malloc,并且在调用realloc()之前其值已更改。因此,它显示未定义的行为