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
一次又一次地重新分配,其中包含 n
个 buffer
,但事实并非如此。相反,我的调试器显示 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 运算符。我不知道那是不是你想要的。
(实际上,分配大小没有存储在任何地方并不完全正确。它可能是,或者可能是它的某种近似值。但它存储在内存分配库的内部,并且没有获取它的方法。无论如何,它可能不正确,因为库有时分配的比你要求的多,而且它只记住它分配的东西,而不是你要求的。)
我很无聊,想制作一个程序让我的电脑崩溃 :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
一次又一次地重新分配,其中包含 n
个 buffer
,但事实并非如此。相反,我的调试器显示 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 运算符。我不知道那是不是你想要的。
(实际上,分配大小没有存储在任何地方并不完全正确。它可能是,或者可能是它的某种近似值。但它存储在内存分配库的内部,并且没有获取它的方法。无论如何,它可能不正确,因为库有时分配的比你要求的多,而且它只记住它分配的东西,而不是你要求的。)