减少动态创建的数组的大小有困难。下面是我的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
缩小记忆的问题,但是他们都说这是可能的。我正在使用带有GCC 4.8.2的Ubuntu 14.04,并使用
-std=c99
选项编译它。 最佳答案
b[8]
在第二个调用中访问未分配的内存并调用未定义的行为。这就是基本上未定义的行为意味着什么。结果难以预料。它可能看起来工作得很好,但下次可能,很好,撞车。这里几乎没有其他需要考虑的事情-printf
可能无法分配内存,因此用malloc
宏检查其返回值是错误的。assert
应该用于调试不可能的或错误的代码,如访问超出其界限的数组。
不应将assert
的结果强制转换。Do I cast the result of malloc?malloc
可能无法重新分配类似于realloc
的内存块。当失败时,它返回malloc
并保持旧块不变。这意味着您将丢失旧内存块的句柄,从而导致其泄漏。在调用NULL
之前,应该将指向旧块的指针存储在变量中。
关于c - 为什么不重新分配收缩数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23647168/