gpt4 book ai didi

c - 为什么 realloc 不缩小数组?

转载 作者:太空宇宙 更新时间:2023-11-04 05:02:57 24 4
gpt4 key购买 nike

我无法减小动态创建的数组的大小。这是我的 main 函数的样子:

int main(void) {
// Intialize big array
int * a = (int *)malloc(10*sizeof(int));
assert(a);
// Fill it with squares
for (int i = 0; i < 10; ++i)
a[i] = i*i;
// Expected to print 64
printf("%d\n", a[8]);
// Shrink the big array
int * b = (int *)realloc(a, 5*sizeof(int));
assert(b);
// Expected to cause SEGFAULT
printf("%d\n", b[8]);
return 0;
}

printf("%d\n", b[8]); 行外,一切正常,因为它打印 64,但不会导致 SEGFAULT 错误我期望它。为什么?

我想我遗漏了一些简单的东西,因为我已经看到很多与使用 realloc 缩小内存相关的 SO 问题,但他们都说这是可能的。

我将 Ubuntu 14.04 与 GCC 4.8.2 一起使用,并使用 -std=c99 选项进行编译。

最佳答案

b[8] 在第二个 printf 调用中访问未分配的内存并调用未定义的行为。这基本上就是未定义行为的意思。结果是不可预测的。它可能看起来工作正常,但下一次它可能会崩溃。这里几乎没有其他事情需要考虑 -

  • malloc 可能无法分配内存,因此使用 assert 宏检查其返回值是错误的。 assert 应用于调试不可能或错误的代码,例如访问超出其范围的数组。

  • 您不应该强制转换 malloc 的结果。 Do I cast the result of malloc?

  • realloc 可能无法像 malloc 一样重新分配内存块。当它失败时,它返回 NULL 并保持旧 block 不变。这意味着您将失去对旧内存块的处理,从而导致其泄漏。在调用 realloc 之前,您应该将指向旧 block 的指针存储在变量中。

关于c - 为什么 realloc 不缩小数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23647168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com