我想知道如果我尝试realloc()一个已递增的指针会发生什么。例如
char *ptr = NULL;
size_t siz = 256;
ptr = malloc(siz);
ptr = realloc(ptr + 5, siz * 2);
realloc()
来电的回报价值是多少?我也知道realloc()
的文档说明传递给它的指针必须由malloc(),calloc()
或realloc()
返回。我假设这意味着我不能realloc()
增加指针,但我无法验证该假设。
答案 0 :(得分:4)
这不会以任何可预测的方式起作用,结果将是未定义的。您传递给realloc
或free
的第一个参数必须由malloc
,realloc
或calloc
返回,或者必须为NULL
。< / p>
在这种情况下,ptr[5]
不适用,因为ptr[5]
未初始化。您还将收到编译错误或警告,因为ptr[5]
不是指针。但即使它是一个指针(例如char **ptr;
),它仍然是未初始化的,因此条件是错误的,因此结果是未定义的,并且很可能该过程会崩溃。
在这种情况下,ptr + 5
也不是这样,因为ptr + 5
,malloc
或realloc
未返回calloc
(但{ptr
1}} was),而不是NULL
。在这种情况下,行为是未定义的,很可能该过程会崩溃。
答案 1 :(得分:2)
正如pts所说,行为未定义。 Here's a reference to the relevant documentation。我希望您能够获得段错误,但是如果不进行测试,您无法知道这对您的特定系统的影响。
尝试ideone.com gives you a memory error:
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
的实现因系统而异,但基本的想法是,某处,您的操作系统has a list of pointers and associated regions of memory that have been malloc
'd。当您致电realloc
时,它会在查找表中查找您传递给它的地址。它无法找到它,因此它放弃并转储核心。
答案 2 :(得分:2)
malloc
族函数分配内存,然后返回指向该块的指针。 ptr + 5
未返回malloc
,因此您无法将其传递给realloc
,因为它期望其第一个参数是calloc
或malloc
返回的指针或realloc
本身。它将调用未定义的行为。
[...]否则,如果参数与之前由内存管理函数返回的指针不匹配,或者通过调用
free
或realloc
来释放空间,< strong>行为未定义。