【发布时间】:2023-03-07 19:09:02
【问题描述】:
我即将读完 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。但是,它没有通过递归的第二个循环(请参阅我的 ghetto 调试评论)。该程序崩溃,并显示一条非常不具信息性的(对我而言)消息(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。
【问题讨论】:
-
现在你有一个堆栈溢出崩溃,你对内存有了更好的理解。有趣的是事情是这样发展的。
-
是的,我是编程新手,但对测试的想法并不陌生。我是一名工程师和重度软件用户,我非常清楚打破事物是理解它们的最佳方式! :-)
标签: c