在C中进行函数调用时,是否使用操作系统的堆栈,以及堆栈的大小是否固定?

在C中进行函数调用时,是否使用操作系统的堆栈,以及堆栈的大小是否固定?,c,function,memory,segmentation-fault,stack,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); } #包括 #定义第10000行 #定义第10000列 void hello(int arr[行][列]){ printf(“hoho”

这是我的密码

#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);
}
#包括
#定义第10000行
#定义第10000列
void hello(int arr[行][列]){
printf(“hoho”);
}
void main(){
int arr[行][列];
你好(arr),;
}
现在,这给了我一个错误。我的问题是,我理解在进行函数调用时,堆栈用于保存传递给函数的所有变量。这就是操作系统的堆栈吗?i、 操作系统是否有专门为此设计的单独内存块

此外,堆栈的大小是否固定

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

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

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

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

“视情况而定”。C甚至没有指定有任何称为“堆栈”的东西用于局部变量或调用

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


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

操作系统的所有任务都有一个单独的堆栈。如果你能如此轻易地破坏操作系统内存,那就太可怕了。
根据编译器的不同,您通常有大约1 MiB的堆栈内存。如果需要使用如此大量的内存,请使用
malloc
calloc
从堆中分配内存

编辑

是Windows内存布局的样子。

是关于这方面的文章。

操作系统的所有任务都有一个单独的堆栈。如果你能如此轻易地破坏操作系统内存,那就太可怕了。
根据编译器的不同,您通常有大约1 MiB的堆栈内存。如果需要使用如此大量的内存,请使用
malloc
calloc
从堆中分配内存

编辑

是Windows内存布局的样子。

这篇文章是关于这个的。

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

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

如果您使用的是linux

ulimit -a 
这是查看堆栈大小和其他选项的命令

 ulimit -s unlimited
将堆栈大小设置为无限大小

在我的机器里

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

在产生seg故障的地方,以及在改变堆栈大小以取消限制时,它确实工作得很好

可能是

man -a ulimit
是在程序逻辑中解决此问题的选项

p.S-这是特定于linux环境的

如果您在linux中

ulimit -a 
这是查看堆栈大小和其他选项的命令

 ulimit -s unlimited
将堆栈大小设置为无限大小

在我的机器里

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

在产生seg故障的地方,以及在改变堆栈大小以取消限制时,它确实工作得很好

可能是

man -a ulimit
是在程序逻辑中解决此问题的选项



p.S-这是特定于linux环境的

使用malloc()可以使用的最大堆栈内存是多少?RAM的大小?@Kraken我不认为有任何保证,例如,您的操作系统可以轻松实现每个进程(或每个用户)的限制,这将导致
malloc()
失败。这不是“堆栈内存”,而是“堆”或“动态”内存。是的,堆,对不起,我的不好。谢谢。malloc()接受size\u t作为参数(实现为unsigned int)。因此,从理论上讲,您永远不能超过2^32(4294967296)字节。@Ali在64位系统上不正确。使用malloc()可以使用的最大堆栈内存是多少?RAM的大小?@Kraken我不认为有任何保证,例如,您的操作系统可以轻松实现每个进程(或每个用户)的限制,这将导致
malloc()
失败。这不是“堆栈内存”,而是“堆”或“动态”内存。是的,堆,对不起,我的不好。谢谢。malloc()接受size\u t作为参数(实现为unsigned int)。所以从理论上讲,您不能超过2^32(4294967296)字节。@Ali在64位系统上不正确。1MB?我不认为我的数组会占用那么多空间?更糟糕,但比@bash.d更准确,
10^4*10^4==10^8
@bash.d 10000*10000不是100万,比这还要多。@bash.d类似地,操作系统是否为每个进程提供了单独的堆?最大限度是多少?@Kraken你说得对。。。基础数学不及格。。。您应该熟悉虚拟内存、分页等。例如,在32位系统上,进程可以使用4 GiB的虚拟内存。因此,从理论上讲,您可以在堆上占用4Gib的内存,但这最终会杀死您的机器,因为它会一次又一次地忙于分页。1MB?我不认为我的数组会占用那么多空间?更糟糕,但比@bash.d更准确,
10^4*10^4==10^8
@bash.d 10000*10000不是100万,比这还要多。@bash.d类似地,操作系统是否为每个进程提供了单独的堆?最大限度是多少?@Kraken你说得对。。。基础数学不及格。。。你应该让你自己