减少动态创建的数组的大小有困难。下面是我的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/

10-16 19:11