【问题标题】:Using realloc() crahes program使用 realloc() 崩溃程序
【发布时间】:2013-07-29 09:16:31
【问题描述】:

我在使用realloc() 时遇到了一些问题,所以我用尽可能少的代码制作了一个示例程序来说明问题。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    unsigned int i;
    unsigned long long *a;
    srand(time(NULL));
    a = malloc(sizeof(unsigned long long));
    for (i = 0; i < 20; ++i)
    {
        a[i] = rand() % 32;
        printf("%llu\n", a[i]);
        a = realloc(a, (i + 1) * sizeof(unsigned long long));
    }
    return 0;
}

这个输出:

* 检测到 glibc 演示:realloc():无效的下一个大小:0x0000000000dc3010 **

为什么会崩溃?

编辑: 我尝试将(i + 1) 更改为(i + 2),然后程序运行了,但我不明白为什么。我只请求将内存空间扩展一个 unsigned long long

【问题讨论】:

  • 您没有收到任何编译错误吗?
  • 没有。这是一条运行时消息。
  • 它必须访问受保护之外的数组。

标签: c realloc


【解决方案1】:

第一次运行循环时,i 等于 0。你重新分配a 来保存i + 1 元素,即... 1 ! 第二次循环运行时,您尝试使用i == 1 写入a[i],这是数组的second 元素。但由于您的数组只能容纳 1 元素,这可能会导致崩溃。

【讨论】:

  • 非常好 Nbr!它是由于缓冲区溢出,而是因为relloc() 函数正确吗?
  • 是的,但这只是因为重新分配本身太小了。正如另一位回答者所提到的,应该是 i + 2 比当前数量多持有一个元素。
【解决方案2】:

您正在分配位置i,但访问位置i+1

并且不要忘记在退出之前释放分配的内存

free(a);

所以做这个修改以使这段代码工作

a = realloc(a, (i + 2) * sizeof(unsigned long long)); // ERROR HERE

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

    int main(void)
    {
        unsigned int i;
        unsigned long long *a;
        srand(time(NULL));
        a = malloc(sizeof(unsigned long long));
        for (i = 0; i < 20; ++i)
        {
            a[i] = rand() % 32;
            printf("%llu\n", a[i]);
            a = realloc(a, (i + 1) * sizeof(unsigned long long)); // ERROR HERE
        }
        return 0;
    }

【讨论】:

  • 哦,是的,忘了说:我试过了,然后它起作用了,但我不明白为什么。将在几秒钟内更新帖子。
猜你喜欢
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2017-03-26
  • 2018-09-13
  • 2012-03-05
相关资源
最近更新 更多