C中的分段错误

May*_*rma 0 c

#include <stdio.h>

int main()
{
    int n[100000];
    int t,q;
    int i,j;
    char s[3][100000];
    char qstr[3][200][100000];
    printf("Success\n");
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,大小qstr约为57.22 MiB.当仍有超过1 GiB的可用内存时,为什么会出现Segmentation故障?如果我更改声明,qstr因为qstr[3][200][10000]程序执行没有问题,实际打印"成功",然后退出.在这种情况下,'qstr'仅占据约5.7 MiB.

我有两个问题:

  1. 我怎么知道这个限制?

  2. 鉴于我有更多的可用内存,我该如何利用它?

Tri*_*ner 6

答案是堆栈大小.有两个记忆:堆和堆栈.

数组在堆栈中分配.您现在可以使用该ulimit -a命令进行限制.在我的系统上,我得到了stack size (kbytes, -s) 8192,最多8Mb.你可能也一样.

如果你想在堆中分配,你需要玩malloc,指针等.

例如

char* qstr = malloc(3 * 200 * 100000);
Run Code Online (Sandbox Code Playgroud)

  • `static char qstr [3] [200] [100000];`也可以工作,但这对多线程进程有影响. (2认同)