这是我的代码
#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);
}
现在,这给了我分段错误。我的问题是,我理解在进行函数调用时,堆栈用于保存传递给函数的所有变量。这是OS的堆栈吗?即OS是否有专门为此设计的独立内存块?
另外,堆栈的大小是固定的吗?
如果我必须将这些伟大的值传递给我的函数怎么办?
答案 0 :(得分:2)
“这取决于”。 C甚至没有指定任何称为“堆栈”的东西用于局部变量或调用。
实际上,是的,它是正在使用的进程'“真正的”操作系统创建的堆栈,因为它通常具有硬件支持(大多数处理器都有非常有效地实现堆栈的指令)。
通常,大型数组最好“在堆上”分配,即使用malloc()
。
答案 1 :(得分:2)
操作系统的所有任务都有一个单独的堆栈。如果你能够如此轻易地破坏操作系统内存,那将是非常糟糕的
根据您的编译器,您通常需要大约1 MiB的堆栈内存。如果需要使用如此大量的内存,请使用malloc
或calloc
从堆中分配内存。
修改强>
答案 2 :(得分:1)
如果你在linux中
ulimit -a
这是查看堆栈大小以及其他选项的命令
ulimit -s unlimited
将堆栈大小设置为无限大小
在我的机器上它是
堆栈大小(千字节,-s)8192
它产生了一个seg错误,并且在将堆栈大小改为unlmited时它确实工作正常
可能是
man -a ulimit
是在程序逻辑中解决此问题的选项
P.S - 这是针对linux环境的
答案 3 :(得分:0)
绝对不是。应用程序在用户模式下工作,并具有自己的内存空间。对于现代操作系统,每个应用程序在其自己的存储空间中工作,人们不会写入/读取到另一个存储器(除非使用共享存储器)。 当你输入太多的值时,就会出现堆栈溢出。