C realloc()函数失败了。

4
为什么这段代码不能正常工作?
char *x=malloc(100);
x++;
x=realloc(x, 200);

我理解您的意思是x是一个有效的字符串指针,只需将其递增一即可?

4
因为它不是您从malloc()获得的指针... - user529758
4
@NoIdeaForName 这是关于 C 语言的问题。 - Pascal Cuoq
3
文档说明很清楚。传递从malloc或类似函数调用获取的指针。 - David Heffernan
@PascalCuoq 哦,好的,没问题... - user529758
4个回答

7

请参见C标准(C99,7.20.3.4p3)中有关realloc的规定,以下是我的重点强调:

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

如果ptr是一个空指针,则realloc函数会像malloc函数一样处理指定大小。否则,如果ptr不匹配先前由calloc、malloc或realloc函数返回的指针,或者空间已被调用free或realloc函数释放,则行为未定义

在您的情况下,x是由malloc返回的,而不是x + 1。所以您的程序会导致未定义的行为。


1
@usario 如果你使用 ++ 增加指针的值,那么它怎么可能是之前由 malloc() 返回的指针呢? - user529758

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

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

2
想一想 realloc 的作用。当 malloc 在地址 x 处创建指针时,realloc 如何释放地址为 x+1 的指针?
更具体地说,假设您在地址 0x1000 处分配了 100 字节。现在 x 增加,指向 0x1001。然后在新地址调用 realloc。由于 malloccallocrealloc 都没有创建 0x1001,因此由 realloc 调用使用的 free(或等效代码)不知道如何处理 0x1001;它甚至无法理解其占用多少字节的内存。它只知道 0x1000 处的 100 字节。 malloc 和相关函数实现的基本思想是跟踪分配的指针和分配的字节数。然后,在稍后调用 free 时,将查找传递给 free 的指针。如果没有对传递给 free 的指针的引用,除了崩溃外还能做什么呢?对我来说,这比假设您可以继续使用可能有效也可能无效的指针更合理。

1
这是一种未定义行为,如果你认为从malloc()获得了一个指针,那么是错误的。显然,x是由malloc返回的,并且在调用realloc()之前它的值已经被改变了,因此显示出了未定义行为

如果您认为从malloc()获得的指针是错误的,请注意:malloc返回指向新分配内存开头的指针。您想要传达什么? - P0W
@POW:我只是想表达一下,如果malloc返回的指针不匹配,则行为未定义。这里x是由malloc返回的,然后它被更新了,因此它与realloc不匹配,导致行为未定义。如果我理解有误,请纠正我! - Rahul Tripathi
如果在realloc中使用的内存大小与先前分配的大小不匹配,则行为未定义。 - P0W
@POW:- 是的,确切地说就是这个意思,先生!! - Rahul Tripathi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接