C 编程 Malloc 做得不对

Jim*_*ron 0 c linux malloc dynamic-memory-allocation

当我创建一个动态数组时:

int *arr = (int *) malloc( 4 * sizeof(int) );

Run Code Online (Sandbox Code Playgroud)

所以它应该包含 4 个整数(对于空间问题可能还有 2 或 3 个),但为什么这样做:

    for ( int x = 0; x < 30000; x++) {
         arr[x] = x;
     }
Run Code Online (Sandbox Code Playgroud)

我的意思是不应该有 30.000 个变量的空间,而且它工作得很好,可能是什么原因?它是否像 c++ std::vector 一样自动重新分配,或者我如何理解它?

如果我将循环范围设置为 50.000,它会崩溃,但它甚至应该像索引 a[100] 或之前那样崩溃,因为数组有 4 个元素。

如果这很重要,我正在使用 gnu/linux。

我非常努力地理解它。

请帮忙

Dr.*_*eon 5

正如上面的评论中提到的,C不是“边界检查”语言(如果这是你需要的,有很多替代方案可供选择,从 D 到 Nim,也可以很容易地与纯 ANSI C 混合)。

现在,回到你的问题。

你所做的是为 4 个整数分配一些内存。到现在为止还挺好。

您可以访问内存的其他部分(或比最初分配的内存更多的内存 - 请参阅:超出范围)并侥幸逃脱,并不意味着您应该这样做。它可能会崩溃,也可能不会。这就是人们所说的“未定义行为”。

现在,如果您想安全起见,请按照您应该的方式进行:

  1. 先分配你需要的内存
  2. 访问它 - 始终在范围内
  3. 完成后释放它

  • 可能值得补充的是,如果您似乎“侥幸逃脱”,那么当程序中的其他地方添加新代码时,或者当许多其他看似无害的因素发生变化时,您可能无法逃脱它。 (4认同)
  • 如果你似乎侥幸逃脱了,@exnihilo,那并不意味着你*真的*逃脱了惩罚。特别是在较大的程序中,越界可能会导致无法立即识别的影响,例如默默地破坏程序某些远程部分所依赖的数据。 (2认同)