- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我即将读完 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/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 3 年前。 Improve
我目前正在从事类似bash的项目。但是,我需要使用数千个测试来测试该项目,而这些测试无法手动检查。这就是为什么我想自动执行测试。 我的程序使用fgets()来获取用户输入。我知道如何直接向程序发送参数
我想在 Android 中编写一个原生应用程序进行测试表面抛物线。是否有任何简单的程序显示如何创建Surfaceflinger 上的表面、寄存器缓冲区和后置缓冲区。 最佳答案 frameworks/b
有一个对象依赖于计时来正常运行。不幸的是,计时持续时间本身太长,无法实时对其进行实际测试,并且由于对象的性质,缩短持续时间违背了测试的目的。 测试此类对象的最佳方法是什么?理想情况下,会有一些可以使用
我首先要说的是,我是一名几乎没有 C++ 经验的大学生。你听对了多少次?我正在使用 libnodave 库中的测试程序 testISO_TCP(简化版)。该程序在连接到 seimens 300 PLC
我正在尝试构建一个非常简单的libodbc++程序。最近,我们注意到了一个奇怪的内存泄漏,我们认为这是由于ODBC++和IDS驱动程序之间的某个地方引起的-我正在编写一个测试来证明这一点。 我使用以下
我对 JavaScript 还很陌生,我有一点疑问。 我创建了这个 JSFiddle:https://jsfiddle.net/AndreaNobili/1up938xf/ 我只定义了执行简单求和(无
我用三个类文件在 IntelliJ 中创建了一个 maven 项目: package mavenKris; import org.apache.hadoop.io.Text; import org.a
我下载了包含 freeglut 的“非官方 OpenGL 软件 SDK”,但我似乎无法让它工作。我在 Windows 上。我在 Visual Studio 2010 或 MinGW g++ 上都没有成
我正在尝试使用 std::async 在 C++ 中调用异步函数按照这个官方cplusplus.com示例代码。 不幸的是,编译失败了。运行时 mingw32-make ,我收到以下错误: main.
我是一名优秀的程序员,十分优秀!