首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >realloc()递增指针

realloc()递增指针
EN

Stack Overflow用户
提问于 2014-06-19 23:59:21
回答 3查看 399关注 0票数 4
  • 平台:Linux3.2.0 x86 (Debian )
  • 编译器: GCC 4.7.2 (Debian 4.7.2-5)

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

代码语言:javascript
复制
char *ptr = NULL;
size_t siz = 256;

ptr = malloc(siz);

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

realloc()调用的返回值是多少?我还知道,realloc()的文档声明传递给它的指针必须由malloc()、calloc()realloc()返回。我假设这意味着我不能realloc()一个递增的指针,但我无法验证这个假设。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-20 00:02:50

这不会有任何可预测的方式,结果将是未知的。传递给reallocfree的第一个参数必须由mallocrealloccalloc返回,否则必须是NULL

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

在这种情况下,ptr + 5也不是这样的,因为mallocrealloccalloc没有返回ptr + 5 is (但是ptr是),而不是NULL。在这种情况下,该行为是未定义的,很可能该进程会崩溃。

票数 4
EN

Stack Overflow用户

发布于 2014-06-20 00:09:09

malloc家族函数分配内存,然后返回指向该块的指针。ptr + 5不是由malloc返回的,所以您不能将它传递给realloc,因为它希望它的第一个参数是由callocmallocrealloc本身返回的指针。它将调用未定义的行为。

C11: 7.22.3.3:

...Otherwise,如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用freerealloc而被释放,则行为是未定义的

票数 3
EN

Stack Overflow用户

发布于 2014-06-20 00:08:56

如前所述,这种行为是没有定义的。以下是相关文档的参考。我希望您会得到一个分段错误,但如果不进行测试,您将无法知道这在您的特定系统上将如何运行。

ideone.com给出了一个内存错误上试用

代码语言:javascript
复制
int main(void) {
    char *ptr = NULL;
    size_t siz = 256;

    ptr = malloc(siz);

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

    return 0;
}

产量:

代码语言:javascript
复制
*** 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时,它会在其查找表中查找传递给它的地址。它找不到它,所以它放弃并转储核心。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24318050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档