mic*_*ael 3 c memory memory-management
我究竟做错了什么?在Mac(2GB RAM)上使用Eclipse时遇到了以下问题:
每当我尝试创建一个超过8384896字节的数组时,我就会出现分段错误.以下程序将执行:
#include <stdio.h>
main()
{
double x[1048112];
printf("sizeof(x) = %li", sizeof(x));
}
Run Code Online (Sandbox Code Playgroud)
输出将是(如预期的那样):
sizeof(x)= 8384896
但是增加x中的元素数量或在main()中创建其他变量会导致无法执行的程序和段错误.看起来我正在达到一些内存限制,我不明白为什么会发生这种情况.如果有人能向我解释这个问题,或者可能为我的问题提供某种解决方案,我将非常感激.
Jam*_*lis 14
由于堆栈变量过大,这是堆栈溢出.
如果你真的需要分配大的东西,你可以在堆上使用malloc:
double *x = malloc(1048112 * sizeof(double));
Run Code Online (Sandbox Code Playgroud)
请注意,通过此更改,sizeof(x)不再返回数组的大小,它返回的大小double *.如果你需要知道你的阵列有多大,你需要自己跟踪它.
并且,为了完整性,当您完成数据时,您将需要调用free,否则您将有一个内存泄漏:
free(x);
Run Code Online (Sandbox Code Playgroud)
OS X上的进程受限制,默认为8MB堆栈(尝试ulimit -s从命令行运行).
一种选择是尝试通过使用类似的东西来增加堆栈大小ulimit -s 65536.这应该会影响从当前shell会话运行的所有新进程.
更好的选择是在堆上分配数组:
double *x = (double*)malloc(9999999)
Run Code Online (Sandbox Code Playgroud)
当你完成数组时,不要忘记使用以下方法解除分配: free(x)
编辑:尝试此参考以获取有关如何使用链接器增加OS X上的最大堆栈大小的信息.同样,首选选项只是在堆上分配大型数组.更轻松,更便携.