首页 > 解决方案 > 使用 malloc 给了我比预期更多的内存?

问题描述

我正在尝试掌握malloc,到目前为止,在测试和使用它时,我大多会得到意想不到的结果。

int main(int argc, char** argv)
{
    int size = 10;
    int *A;
    A = (int *)malloc(size * sizeof(int));
    for (int i = 0; i < 10000; i++)
    {
        A[i] = i;
    }
    for (int i = 0; i < 10000; i++)
    {
        printf("%d) %d\n", i, A[i]);
    }
}

例如,使用上面的示例代码,代码运行没有错误。即使我只分配A了 10 * int,所以我希望循环在遇到错误之前只运行 10 次。如果我将循环增加到大约 30-40k,则会遇到分段错误。但是,如果我将大小增加到循环量,它总是会像预期的那样工作。所以我知道如何避免错误.. 有点,我只是希望有人可能会很好地解释为什么会这样。

编辑:原来我不明白 C 没有检测到越界,Java 和 C++ 对我的照顾太多了。我有未定义的行为,现在知道阻止它们是我的工作。感谢所有回复的人。

标签: carraysmemorydynamicmalloc

解决方案


C 不需要对数组访问执行任何边界检查。它可以让您在没有任何警告或错误的情况下读/写过去。

您通过在分配的内存结束后读取和写入来调用未定义的行为。这意味着您的程序的行为无法预测。它可能会崩溃,它可能会输出奇怪的结果,或者它可能(如您的情况)似乎正常工作。

程序会崩溃并不意味着它会崩溃。


推荐阅读