calloc 创建的数组未按预期运行

calloc created array is not acting as expected

我很无聊,想制作一个程序让我的电脑崩溃 :P。我会让它无用地和冗余地分配内存直到崩溃。到目前为止我创建的代码在这里:

#include <cstdlib>
#include <cstdio>

int main(int argc, const char *argv)
{
    int n = 0;
    while (1)
    {
        n++;
        int* buffer = (int*)malloc(n ^ n);
        int* buffer_buffer = (int*)calloc(n, sizeof(buffer));
        for (int i = 0; i < n; i++) {
            printf("%p", &buffer);
            printf("\n");
            buffer_buffer[i] = (int)buffer;
        }
    }
}

代码有效(它使计算机崩溃),但无法正常工作,因为 expected.I 想深入了解它的工作原理以及它究竟在做什么,所以我设置了几个断点并决定逐步完成它。我希望看到 buffer_buffer 一次又一次地重新分配,其中包含 nbuffer,但事实并非如此。相反,我的调试器显示 buffer_buffer 包含一个有时会更改的单个值,并且每次循环都会记录一个值(至少我希望 buffer 的整数转换)。每次 for 循环出现时,我都希望 buffer_buffer 的元素数量增加 n,但它只有一个元素。为了形象化这一点,这里是调试器的屏幕截图:

我又有点累了,这可能是我的循环逻辑的问题。有谁知道为什么我的程序会遇到这种意外行为?我正在使用 Microsoft Visual Studio 调试器

可能您的调试器不知道 buffer_buffer 有多大,因为该变量被简单地声明为指向 int 的指针。 (输入不正确;buffer_buffer 用于保存 buffer 的值,这是一个 int*,因此 buffer_buffer 必须是 int* 的数组,这意味着你应该将它声明为 int**,即指向 int* 序列的指针。)调试 C 程序的一个小挑战是数组的长度根本不存储在任何地方;你必须自己跟踪它。所以调试器也不知道。

此外,n^n 为 0,因为 ^ 是 XOR 运算符。我不知道那是不是你想要的。


(实际上,分配大小没有存储在任何地方并不完全正确。它可能是,或者可能是它的某种近似值。但它存储在内存分配库的内部,并且没有获取它的方法。无论如何,它可能不正确,因为库有时分配的比你要求的多,而且它只记住它分配的东西,而不是你要求的。)