我刚读完K&R,这就是我所知道的所有C语言.我的所有编译都是使用MinGW从Windows命令行完成的,我不了解高级调试方法(因此我的第二个程序中的"ghetto debug"注释).
我正在尝试制作一些小型测试程序,以帮助我更好地理解内存分配的工作原理.这些前几个程序不使用malloc或free,我只是想看看如何为函数本地的标准数组分配和解除分配内存.我的想法是,我观察我的运行进程RAM使用情况,看它是否符合我的理解.对于下面的第一个程序,它确实按预期工作.该alloc_one_meg()函数分配并初始化250,000个4字节整数,但是一旦函数返回,该MB就会被解除分配.因此,如果我连续10000次调用该函数,我永远不会看到我的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();
}
}
Run Code Online (Sandbox Code Playgroud)
对于下面的第二个程序,想法是不允许函数退出,同时运行1000个相同函数的副本,这是我通过递归完成的.我的理论是,在递归完成之后,程序将消耗1GB的RAM,然后才将其全部解除分配.但是,它不会通过递归超过第二个循环(请参阅我的ghetto调试注释).该程序崩溃了一个非信息性(对我而言)的消息(Windows弹出窗口说____.exe遇到了问题).通常我总是可以通过我的贫民窟调试方法找到问题的根源......但它在这里不起作用.我很难过.这段代码有什么问题?谢谢!
#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();
}
Run Code Online (Sandbox Code Playgroud)
后续问题发布在这里 …
c ×1