gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:48:22 27 4
gpt4 key购买 nike

我很无聊,想制作一个程序让我的电脑崩溃 :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,但事实并非如此。相反,我的调试器显示 buffer_buffer 包含一个有时会更改的值,并且每次都会记录一个值(至少我希望是 buffer 的整数转换)循环。每次 for 循环出现时,我都希望 buffer_buffern 个元素增长,但它只有一个元素。为了形象化这一点,这里是调试器的屏幕截图:

Debugger

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

最佳答案

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

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


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

关于c++ - calloc 创建的数组未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30519793/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com