1

这是我的代码

#include<stdio.h>
#define ROW 10000
#define COLUMN 10000
void hello(int arr[ROW][COLUMN]){
    printf("hoho");
}
void main(){
    int arr[ROW][COLUMN];
    hello(arr);
}

现在,这给了我分段错误。我的问题是,我知道在进行函数调用时,堆栈用于保存所有传递给函数的变量。那么这是操作系统的堆栈吗?即操作系统是否有专门为此设计的单独内存块?

另外,堆栈的大小是固定的吗?

如果我必须将如此重要的价值传递给我的函数怎么办?

4

4 回答 4

2

“这取决于”。C 甚至没有指定用于局部变量或调用的任何称为“堆栈”的东西。

实际上,是的,正在使用的是进程的“真实”操作系统创建的堆栈,因为它通常具有硬件支持(大多数处理器都有非常有效地实现堆栈的指令)。

通常,最好在“堆上”分配大型数组,即使用malloc().

于 2013-04-30T09:10:53.697 回答
2

操作系统的所有任务都有一个单独的堆栈。如果您可以如此轻松地破坏操作系统内存,那将是可怕的。
根据您的编译器,您通常有大约 1 MiB 的堆栈内存。如果您需要使用如此大量的内存,请使用malloccalloc从堆中分配内存。

编辑

就是 Windows 内存布局的样子。
是关于此的文章。

于 2013-04-30T09:12:21.343 回答
1

if you are in linux

ulimit -a 

this is the command to see stack size along with other options

 ulimit -s unlimited

will set the stack size to unlimited size

in my machine it was

stack size (kbytes, -s) 8192

where it produced a seg fault and on altering the stack size to unlmited it did work fine

may be

man -a ulimit

is the option to resolve this in program logic

P.S - this is specific to linux environment

于 2013-05-12T17:30:19.830 回答
0

当然不。应用程序在用户模式下工作,并且有自己的内存空间。对于现代操作系统,每个应用程序都在自己的内存空间中工作,一个人不会写入/读取另一个人的内存(除非使用共享内存)。当你输入太多值时,你会得到堆栈溢出。

于 2013-04-30T09:20:38.207 回答