gpt4 book ai didi

c - 了解内存分配,测试程序崩溃

转载 作者:太空狗 更新时间:2023-10-29 17:23:07 24 4
gpt4 key购买 nike

我即将读完 K&R,这就是我所知道的所有 C 语言。我的所有编译都是使用 MinGW 从 Windows 命令行完成的,我对高级调试方法一无所知(因此在我下面的第二个程序中有“ghetto debug”注释)。

我正在尝试制作一些小的测试程序来帮助我更好地理解内存分配的工作原理。这些前几个程序不使用 malloc 或 free,我只是想看看如何为函数本地的标准数组分配和取消分配内存。这个想法是,我观察我正在运行的进程 RAM 使用情况,看看它是否符合我的理解。对于下面的第一个程序,它确实按我预期的那样工作。 alloc_one_meg() 函数分配并初始化 250,000 个 4 字节整数,但该 MB 会在函数返回后立即取消分配。因此,如果我连续调用该函数 1000000 次,我永远不会看到我的 RAM 使用量超过 1MB。而且,它有效。

#include <stdio.h>
#include <stdlib.h>

void alloc_one_meg() {
int megabyte[250000];
int i;
for (i=0; i<250000; i++) {
megabyte[i] = rand();
}
}

main()
{
int i;
for (i=0; i<1000000; i++) {
alloc_one_meg();
}
}

对于下面的第二个程序,我的想法是不允许函数退出,同时运行 1000 个相同函数的副本,这是我通过递归实现的。我的理论是该程序在递归完成后全部取消分配之前会消耗 1GB 的 RAM。但是,它没有通过递归的第二个循环(请参阅我的贫民窟调试评论)。该程序崩溃并显示一条(对我而言)非常无信息的消息(Windows 弹出窗口说 ____.exe 遇到问题)。通常我总能用我的 ghetto 调试方法弄清楚事情的真相……但它在这里不起作用。我很难过。这段代码有什么问题?谢谢!

#include <stdio.h>
#include <stdlib.h>

int j=0;

void alloc_one_meg() {
int megabyte[250000];
int i;
for (i=0; i<250000; i++) {
megabyte[i] = rand();
}
j++;
printf("Loop %d\n", j); // ghetto debug
if (j<1000) {
alloc_one_meg();
}
}

main()
{
alloc_one_meg();
}

已发布后续问题 here .

最佳答案

你遇到了堆栈溢出。

局部自动存储变量(如megabyte)分配在栈上,空间有限。 malloc 在堆上分配,这允许更大的分配。

您可以在这里阅读更多内容:

http://en.wikipedia.org/wiki/Stack_overflow

(我应该注意,C 语言没有指定内存分配的位置 - 堆栈和堆是实现细节)

关于c - 了解内存分配,测试程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8611198/

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