我想知道,如果我尝试realloc()一个已经递增的指针,会发生什么。例如
char *ptr = NULL;
size_t siz = 256;
ptr = malloc(siz);
ptr = realloc(ptr + 5, siz * 2);realloc()调用的返回值是多少?我还知道,realloc()的文档声明传递给它的指针必须由malloc()、calloc()或realloc()返回。我假设这意味着我不能realloc()一个递增的指针,但我无法验证这个假设。
发布于 2014-06-20 00:02:50
这不会有任何可预测的方式,结果将是未知的。传递给realloc或free的第一个参数必须由malloc、realloc或calloc返回,否则必须是NULL。
在本例中,ptr[5]不适用,因为ptr[5]未初始化。您还将收到编译错误或警告,因为ptr[5]不是指针。但是即使它是一个指针(例如char **ptr;),它仍然是未初始化的,因此条件是假的,因此结果是未定义的,而且很可能进程会崩溃。
在这种情况下,ptr + 5也不是这样的,因为malloc、realloc或calloc没有返回ptr + 5 is (但是ptr是),而不是NULL。在这种情况下,该行为是未定义的,很可能该进程会崩溃。
发布于 2014-06-20 00:09:09
malloc家族函数分配内存,然后返回指向该块的指针。ptr + 5不是由malloc返回的,所以您不能将它传递给realloc,因为它希望它的第一个参数是由calloc、malloc或realloc本身返回的指针。它将调用未定义的行为。
C11: 7.22.3.3:
...Otherwise,如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用
free或realloc而被释放,则行为是未定义的。
发布于 2014-06-20 00:08:56
如前所述,这种行为是没有定义的。以下是相关文档的参考。我希望您会得到一个分段错误,但如果不进行测试,您将无法知道这在您的特定系统上将如何运行。
在ideone.com给出了一个内存错误上试用
int main(void) {
char *ptr = NULL;
size_t siz = 256;
ptr = malloc(siz);
ptr = realloc(ptr + 5, siz * 2);
return 0;
}产量:
*** Error in `./prog': realloc(): invalid pointer: 0x09dc900d ***
======= Backtrace: =========
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x75e72)[0xb7641e72]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(realloc+0x275)[0xb7645ad5]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(realloc+0x28b)[0xb7645aeb]
./prog[0x80483e8]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(__libc_start_main+0xf5)[0xb75e58f5]
./prog[0x804840d]malloc的实现因系统而异,但基本思想是,在某个地方,您的OS 德德。调用realloc时,它会在其查找表中查找传递给它的地址。它找不到它,所以它放弃并转储核心。
https://stackoverflow.com/questions/24318050
复制相似问题