gpt4 book ai didi

c - 没有优化的 gcc 段错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:16:12 24 4
gpt4 key购买 nike

以下代码可以编译,但在未使用 GCC 优化时会出现段错误:

#include <stdio.h>

#define n 10000000

int main()
{
fprintf(stderr, "Array with size %ld\n", n * sizeof(double));
double a[n];
return 0;
}

$ gcc -O0 a.c && ./a.out
Segmentation fault (core dumped)
$ gcc -O1 a.c && ./a.out
Array with size 80000000

我用 -O1、-O2、-O3 测试过,甚至用 -Og 也能正常工作。但是对于 -O0 它会出现段错误。我正在使用 GCC 5.3.0。

如果我删除 fprintf,或者如果我将数组更改为 static double[N],则不会出现段错误。

为什么?发生了什么事?

最佳答案

默认的堆栈 大小通常很小(例如 8MB)。您的数组大小可能太大并且溢出了堆栈。您可以尝试更改 *nix 系统上的默认堆栈大小:

ulimit -s unlimited 

在一般情况下,没有可移植的解决方案来确定具有自动存储持续时间(也称为“堆栈”)的给定数组分配是否会成功。因此,在分配相当大的对象时,最好使用 malloc()

关于c - 没有优化的 gcc 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34906354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com