为什么这段代码不能正常工作?
我理解您的意思是x是一个有效的字符串指针,只需将其递增一即可?
char *x=malloc(100);
x++;
x=realloc(x, 200);
我理解您的意思是x是一个有效的字符串指针,只需将其递增一即可?
请参见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
。所以您的程序会导致未定义的行为。
++
增加指针的值,那么它怎么可能是之前由 malloc()
返回的指针呢? - user529758char *x=malloc(100);
x++;
x=realloc(x, 200);
realloc()
函数之前,指针 x
指向的地址被更改。这是 C 语言 中未定义的行为。realloc
的作用。当 malloc
在地址 x
处创建指针时,realloc
如何释放地址为 x+1
的指针?x
增加,指向 0x1001。然后在新地址调用 realloc
。由于 malloc
、calloc
和 realloc
都没有创建 0x1001,因此由 realloc
调用使用的 free
(或等效代码)不知道如何处理 0x1001;它甚至无法理解其占用多少字节的内存。它只知道 0x1000 处的 100 字节。
malloc
和相关函数实现的基本思想是跟踪分配的指针和分配的字节数。然后,在稍后调用 free
时,将查找传递给 free
的指针。如果没有对传递给 free
的指针的引用,除了崩溃外还能做什么呢?对我来说,这比假设您可以继续使用可能有效也可能无效的指针更合理。malloc()
获得了一个指针,那么是错误的。显然,x
是由malloc
返回的,并且在调用realloc()
之前它的值已经被改变了,因此显示出了未定义行为。realloc
中使用的内存大小与先前分配的大小不匹配,则行为未定义。 - P0W
malloc()
获得的指针... - user529758