在C中进行函数调用时,是否使用了OS堆栈,并且堆栈的大小是否已修复?

时间:2013-04-30 09:08:06

标签: c function memory segmentation-fault stack

这是我的代码

#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是否有专门为此设计的独立内存块?

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

如果我必须将这些伟大的值传递给我的函数怎么办?

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

修改

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

答案 2 :(得分:1)

如果你在linux中

ulimit -a 

这是查看堆栈大小以及其他选项的命令

 ulimit -s unlimited

将堆栈大小设置为无限大小

在我的机器上它是

堆栈大小(千字节,-s)8192

它产生了一个seg错误,并且在将堆栈大小改为unlmited时它确实工作正常

可能是

man -a ulimit

是在程序逻辑中解决此问题的选项

P.S - 这是针对linux环境的

答案 3 :(得分:0)

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