【问题标题】:While making a function call in C, is the stack of OS used, and is the size of stack fixed?在 C 中进行函数调用时,是否使用了操作系统的堆栈,堆栈的大小是否固定?
【发布时间】:2013-04-24 03:38:32
【问题描述】:

这是我的代码

#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);
}

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

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

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

【问题讨论】:

    标签: c function memory segmentation-fault stack


    【解决方案1】:

    如果你在linux中

    ulimit -a 
    

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

     ulimit -s unlimited
    

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

    在我的机器上是

    堆栈大小(kbytes,-s)8192

    它在哪里产生了段错误并且在将堆栈大小更改为无限时它确实工作正常

    可能是

    man -a ulimit
    

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        编辑

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

        【讨论】:

        • 1MB?我不认为我的阵列会占用那么多空间?
        • 更差,但比@bash.d、10^4*10^4==10^8更准确
        • @bash.d 10000*10000 不是 100 万,远不止于此。
        • @bash.d 同样,操作系统是否为每个进程提供单独的堆?最大限制是多少?
        • @Kraken 你是对的...基础数学不及格...您应该熟悉虚拟内存分页等等。例如,在 32 位系统上,进程可以使用 4 GiB 的虚拟内存。因此,理论上您可以在堆上占用 4 GiB 的内存,但这最终会杀死您的机器,因为它会一遍又一遍地忙于分页。
        【解决方案4】:

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

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

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

        【讨论】:

        • 我可以使用 malloc() 使用的最大堆栈内存是多少? RAM 大小?
        • @Kraken 我不认为那里有任何保证,例如,您的操作系统可以轻松实现每个进程(或每个用户)的限制,这会导致 malloc() 失败.这不是“堆栈内存”,而是“堆”或“动态”内存。
        • 是的,堆,对不起我的错。谢谢。
        • malloc() 接受 size_t 作为参数(实现为 unsigned int)。所以理论上你永远不能超过 2^32 (4,294,967,296) 字节。
        • @Ali 在 64 位系统上不正确。
        猜你喜欢
        • 1970-01-01
        • 2013-10-12
        • 2015-12-11
        • 2022-01-16
        • 2021-03-15
        • 2015-09-11
        • 1970-01-01
        • 2010-09-15
        • 2021-08-06
        相关资源
        最近更新 更多