4

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

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

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

4

4 回答 4

7

请参阅 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。所以你的程序会调用未定义的行为。

于 2013-09-15T14:59:17.027 回答
2
char *x=malloc(100);
x++;
x=realloc(x, 200);

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

于 2013-09-15T15:02:29.437 回答
2

想想做什么realloc。当实际在地址处创建指针时,它如何free指向地址处的指针?x+1mallocx

更具体地说,假设您在地址 0x1000 分配了 100 个字节。现在x递增,指向 0x1001。然后你打电话realloc到新地址。因为调用所使用的malloccallocrealloc创建的 0x1001 free(或等效代码)realloc都不知道如何对 0x1001 做任何事情;它甚至无法计算它占用了多少字节的内存。它只知道 0x1000 处的 100 个字节。

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

于 2013-09-15T15:18:41.073 回答
1

undefined behavior如果您认为您从中获得了错误的指针,这就是您的malloc()情况。

显然x是由返回的,malloc并且在调用之前它的值被改变了realloc()因此它显示了未定义的行为

于 2013-09-15T15:00:15.623 回答