c语言中分配一个很大的数组,运行时段错误

发布于 2022-09-01 06:39:11 字数 286 浏览 7 评论 0

int main(int argc, char const *argv[])
{
    int j;
    int a[100000000];

    for (j = 0; j < 100000000; ++j)
    {
        a[j] = j;
    }
    return 0;
}

运行结果:
Segmentation fault (core dumped)
编译时没有错误,这里错误是因为数组太大,导致栈空间不够吗?那一个程序允许的最大栈是多少呢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

似梦非梦 2022-09-08 06:39:11

肯定是栈空间不足,题主这个也太大了。。可以试试放到全局变量。
参考http://www.slyar.com/blog/variable-overflow-static.html

伴随着你 2022-09-08 06:39:11

这个问题101了。这么大的数组炸栈是肯定的。

栈内存一般而言由系统的约束和配置决定,一般来说默认的在1-8M每进程不等。linux和macosx一般可以用ulimit命令调节,但一般仍会受到操作系统的“硬限制”而不能想调多大调多大。

关于系统栈:

  • 系统栈的目的,在于跟踪和追溯函数调用的历史。
  • 这里的函数尤其指每个函数都有功能上的意义,即打印出系统栈就能表示出程序有意义的功能分块。
  • 使用栈内存做算法,不是不好,不过和系统栈的惯例用法毕竟稍微有一点偏差。
  • 层级很深,但每个层级都很类似(单独提取出来,无甚分析价值)的深层搜索,无论是为了防止炸栈,还是为了保持调用栈的简洁可分析,都应当自己建立用户栈。

关于栈内存:

  • 栈内存整批进、整批退,不存在碎片和管理问题,性能优于堆内存。
  • 但相应的代价就是:
    • 其一,比较少,寸土寸金;
    • 其二,函数结束(退栈)之后,栈顶退回函数执行前的位置,则函数中所有局部变量所在的栈内存落在栈外自然销毁。(重要)
  • 因此函数内的局部变量,只应当表示函数内部执行到了什么状态,绝对不能用作实质性的数据区域。
  • 例如:应当用局部变量表示缓冲区的下标、指针,但缓冲区本身绝对不应该开在栈上。
  • 数据区域要么从堆上分配获得指针,要么通过参数传递得到指针。

事实上这里用全局变量也不是唯一的选择(至少全局变量在语义上还是不太好看)。也可以使用malloc()来做,获取按需分配内存的灵活性,不必事前规定一个“足够大的范围”:

int n, i;
int *a, *p;
scanf("%d", &n);
a = malloc(sizeof(int) * n);
p = a;
for (i=0; i<n; i++)
{
    scanf("%d", p++);
}

题外话——“局部变量所在的栈内存区域自然销毁”这件事,坑死多少C程序员。这里不详细展开,但请一定小心不要撞这个常识性的错误,即:不要把任何局部变量的地址用return返回给调用者。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文