为什么这段代码不起作用?
char *x=malloc(100);
x++;
x=realloc(x, 200);
我的意思是 x 是一个有效的字符串指针,只是加一?
请参阅 C 标准 (C99, 7.20.3.4p3)realloc
和我的重点:
void *realloc(void *ptr, size_t 大小);
如果 ptr 是空指针,则 realloc 函数的行为类似于指定大小的 malloc 函数。否则,如果 ptr 与 calloc、malloc 或 realloc 函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 函数被释放,则行为未定义。
在你的情况下x
被退回malloc
,不是x + 1
。所以你的程序会调用未定义的行为。
char *x=malloc(100);
x++;
x=realloc(x, 200);
在上面显示的代码中,指针指向的地址x
在调用realloc()
函数之前已更改。这是C中未定义的行为。
想想做什么realloc
。当实际在地址处创建指针时,它如何free
指向地址处的指针?x+1
malloc
x
更具体地说,假设您在地址 0x1000 分配了 100 个字节。现在x
递增,指向 0x1001。然后你打电话realloc
到新地址。因为调用所使用的malloc
、calloc
和realloc
创建的 0x1001 free
(或等效代码)realloc
都不知道如何对 0x1001 做任何事情;它甚至无法计算它占用了多少字节的内存。它只知道 0x1000 处的 100 个字节。
和朋友的实现背后的基本思想malloc
是您跟踪分配的指针以及分配了多少字节。然后当free
稍后调用时,free
查找传递给的指针。如果没有对传递给的指针的引用,free
除了崩溃还有什么可做的?对我来说,这比假设您可以继续使用可能有效也可能无效的指针更合乎逻辑。
undefined behavior
如果您认为您从中获得了错误的指针,这就是您的malloc()
情况。
显然x
是由返回的,malloc
并且在调用之前它的值被改变了realloc()
因此它显示了未定义的行为。