为什么这段代码不起作用?
char *x=malloc(100);
x++;
x=realloc(x, 200);
我的意思是x是一个有效的字符串指针,只增加一个?
答案 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
。由于malloc
,calloc
和realloc
都没有创建0x1001,因此调用free
所使用的realloc
(或等效代码)不知道该怎么做任何有0x1001的东西;它甚至无法理解它占用多少字节的内存。它只知道0x1000处的100个字节。
malloc
和朋友实现背后的基本思想是跟踪指定的指针和分配的字节数。然后,当稍后调用free
时,将查找传递给free
的指针。如果没有对传递给free
的指针的引用,除了崩溃还有什么可做的?对我来说,这比假设你可以继续使用可能有效或无效的指针更符合逻辑。
答案 3 :(得分:1)
如果你认为你从undefined behavior
获得了一个错误的指针,那么这是malloc()
。
显然,x
已返回malloc
,并且在调用realloc()
之前其值已更改。因此,它显示未定义的行为。