realloc()一个递增的指针

时间:2014-06-19 23:59:22

标签: c malloc

  • 平台:Linux 3.2.0 x86(Debian Wheezy)
  • 编译:GCC 4.7.2(Debian 4.7.2-5)

我想知道如果我尝试realloc()一个已递增的指针会发生什么。例如

char *ptr = NULL;
size_t siz = 256;

ptr = malloc(siz);

ptr = realloc(ptr + 5, siz * 2);

realloc()来电的回报价值是多少?我也知道realloc()的文档说明传递给它的指针必须由malloc(),calloc()realloc()返回。我假设这意味着我不能realloc()增加指针,但我无法验证该假设。

3 个答案:

答案 0 :(得分:4)

这不会以任何可预测的方式起作用,结果将是未定义的。您传递给reallocfree的第一个参数必须由mallocrealloccalloc返回,或者必须为NULL。< / p>

在这种情况下,ptr[5]不适用,因为ptr[5]未初始化。您还将收到编译错误或警告,因为ptr[5]不是指针。但即使它是一个指针(例如char **ptr;),它仍然是未初始化的,因此条件是错误的,因此结果是未定义的,并且很可能该过程会崩溃。

在这种情况下,ptr + 5也不是这样,因为ptr + 5mallocrealloc未返回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,因为它期望其第一个参数是callocmalloc返回的指针或realloc本身。它将调用未定义的行为。

C11:7.22.3.3:

  

[...]否则,如果参数与之前由内存管理函数返回的指针不匹配,或者通过调用freerealloc来释放空间,< strong>行为未定义。