小编Mos*_*man的帖子

c 中每个函数都有自己的堆栈吗?

我最近了解了堆栈,因此我正在尝试了解堆栈大小是多少以及溢出时会发生什么。我发现在 Unix 上默认堆栈大小为 8 MiB,这支持了我的发现,因为我无法在函数中声明大小大于或等于 8 MiB 的字符串main。但是,当我在其中声明变量时,main()它会影响其他函数。例如:

#include <stdio.h>

void foo(void)
{
    long int size = 1024*1024*2;
    char str[size];
    str[size - 1] = 'a';
    printf("%c\n", str[size - 1]);
}

int main(int argc, char** argv)
{
    long int size = 1024*1024*6;
    char str[size];
    str[size - 1] = 'a';
    printf("%c\n", str[size - 1]);
    foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码会导致分段错误,但如果我将字符串大小设置为 5 MiB,main()则不会出现分段错误。这是否意味着我的 C 程序无法为局部变量(所有函数)分配超过 8 MiB 的 RAM?如果是这样,堆栈的意义何在?

c stack-overflow gcc

4
推荐指数
1
解决办法
2559
查看次数

所有局部变量是否在 C 中函数执行开始时同时构造?

说我有一个这样的功能:

int myfunc()
{
    int a;
    // do something
    int b;
    // do something
}
Run Code Online (Sandbox Code Playgroud)

当我调用 myfunc() 时,b 的内存分配是否在 a 之后发生?或者是在第一个“做某事”完成后创建的。

c

1
推荐指数
1
解决办法
57
查看次数

标签 统计

c ×2

gcc ×1

stack-overflow ×1