我很无聊,想要制作程序让我的电脑崩溃: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
一次又一次地重新分配包含n
个buffer
的{{1}},但事实并非如此。相反,我的调试器显示buffer_buffer
包含有时会改变的单个值,并且每次循环记录单个值(至少我希望的buffer
的整数转换)。每当围绕for循环出现时,我期待buffer_buffer
增长n
个元素,但它只有一个元素。为了使其可视化,这是调试器的屏幕截图:
我又有点累了,这可能是我的循环逻辑问题。有谁知道为什么我的程序遇到这种意外行为?我正在使用Microsoft Visual Studio调试器
答案 0 :(得分:4)
可能你的调试器不知道buffer_buffer
有多大,因为该变量只是被声明为指向int
的指针。 (未正确输入; buffer_buffer
用于保存buffer
的值int*
,因此buffer_buffer
必须是int*
的数组,这意味着您应该将其声明为int**
,即指向int*
序列的指针。)调试C程序的一个小挑战是数组的长度根本不存储在任何地方;你必须自己跟踪它。所以调试器也不知道。
此外,n^n
为0,因为^
是XOR运算符。我不知道这是不是你想要的。
(实际上,分配大小不是存储在任何地方都不是真的。它可能是或者可能是某种近似值。但是它存储在内存分配库的内部,并且没有办法无论如何,它可能不正确,因为图书馆有时会分配比你要求的更多,它只会记住它分配的内容,而不是你要求的内容。)