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

时间:2015-05-29 01:40:19

标签: c++ pointers memory-management calloc

我很无聊,想要制作程序让我的电脑崩溃: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;
        }
    }
}

代码工作(它崩溃了计算机),但没有按预期工作。我想更多地了解它的工作方式以及它究竟在做什么,所以我设置了几个断点并决定步骤通过它。我希望buffer_buffer一次又一次地重新分配包含nbuffer的{​​{1}},但事实并非如此。相反,我的调试器显示buffer_buffer包含有时会改变的单个值,并且每次循环记录单个值(至少我希望的buffer的整数转换)。每当围绕for循环出现时,我期待buffer_buffer增长n个元素,但它只有一个元素。为了使其可视化,这是调试器的屏幕截图:

Debugger

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

1 个答案:

答案 0 :(得分:4)

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

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

(实际上,分配大小不是存储在任何地方都不是真的。它可能是或者可能是某种近似值。但是它存储在内存分配库的内部,并且没有办法无论如何,它可能不正确,因为图书馆有时会分配比你要求的更多,它只会记住它分配的内容,而不是你要求的内容。)