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

The*_*111 6 c

我刚读完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)

后续问题发布在这里.

Pub*_*bby 3

您遇到了堆栈溢出。

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

你可以在这里阅读更多:

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

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

  • 太酷了,我在 stackoverflow.com 上了解了堆栈溢出。我应该把这个发布到元上!感谢您的解释和链接。 (4认同)