为什么会出现SIGSEGV错误?

3
为什么这段代码会抛出一个SIGSEGV
int main()
{
    unsigned long toshuffle[9765625];

    unsigned long i;

    for (i=0; i< 1000; i++)
        toshuffle[i]= i;

    return 0;
}

希望能得到指针。 (无意冒犯 :))


1
请你使用 "int main(void)" 或者 "int main (int c,char *v[])",不管你信仰哪个神明,请一定使用标准的写法,这个标准已经存在很久了 :-) - paxdiablo
我的错。在几乎所有情况下我都会遵循这个。 - user59634
3个回答

16

使用malloc()函数获取所需的内存。你正在溢出栈。

unsigned long *toshuffle = malloc(9765625 * sizeof(unsigned long));
当你使用完它后,当然需要free()进行释放。
注意:在C++中,需要将指针强制转换为正确的类型。

8
"Overflowing the stack",终于被说出来了!:))) - kolypto
2
在C++中,您将执行new long[9765625],并且不需要进行任何强制转换或sizeof的操作... :) - falstro
如何使编译器在堆栈大小超过限制时报告错误。 - Rohit Banga
谢谢Jurily,我应该考虑栈大小和堆大小。但是现在我知道了。 - user59634
1
@iamrohitbanga:在编译时,也就是编译器工作的时候,你不知道可用的堆栈大小。 - user59634
5
@Amit 是正确的,但情况比他说的更糟。编译器根本不知道堆栈有多大,它只生成指令。链接程序确实知道堆栈大小,但不知道代码将如何使用它。这意味着您必须在运行时失败。 - paxdiablo

9
也许是因为您无法在堆栈上分配9765625个长整型变量(这个网站叫什么来着?:))。请改用malloc()函数。

2

手册中得知:

  • RLIMIT_STACK

进程栈的最大大小,以字节为单位。达到此限制时,会生成SIGSEGV信号。要处理此信号,进程必须使用备用信号栈(sigaltstack(2))。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接