Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 何时分配静态函数变量?_C - Fatal编程技术网

C 何时分配静态函数变量?

C 何时分配静态函数变量?,c,C,我有一个关于静态变量内存分配的问题。请看下面的片段 #include<stdio.h> #include<conio.h> void fun(); static int a; void main() { fun(); getch(); } void fun() { static int b; } 有人能解释一下,在执行main之前,函数fun中的静态int b何时会被分配内存,或者函数何时被定位。我知道静态内存只分配一次,但我想知道什么时

我有一个关于静态变量内存分配的问题。请看下面的片段

#include<stdio.h>
#include<conio.h>

void fun();

static int a;

void main()
{
    fun();
    getch();
}

void fun()
{
    static int b;
}
有人能解释一下,在执行main之前,函数fun中的静态int b何时会被分配内存,或者函数何时被定位。我知道静态内存只分配一次,但我想知道什么时候会为它分配内存。请解释一下


我使用的是64位处理器、turbo c编译器、windows 7操作系统。

加载程序时,会为静态变量分配内存。函数中的静态变量在第一次调用函数之前初始化。

在这种情况下,没有为b分配。它是一个int,并在加载应用程序时添加到堆栈中。

静态内存通常在程序加载/开始执行之前分配。

静态内存与全局内存位于同一位置。它们的空间在编译时设置,在加载时分配。

示例问题中的静态变量a和b的内存在编译时分配。您可以通过检查地图文件来验证这一点。请注意,根据映射文件中提供的详细信息,您可能看不到静态变量的变量名,而只是看到已分配了相应的内存量。当程序与全局变量一起加载时,它们被初始化…不是第一次调用函数。

当在函数块内使用static时,关键字static会更改变量或函数的存储类,这意味着static int b;就是说b是一个静态变量,而不是一个自动变量

当谈到存储类时,静态类在程序运行之前在静态内存中初始化,并且在程序运行时始终存在,而自动类在到达某个块时在运行时堆栈或堆中初始化,在程序出块时销毁

当static在外部使用时,如在static int a中;显示,这是另一种情况。它将变量的链接更改为内部链接,而默认值为外部链接。它和变量或函数的存储类无关


对于static,a是内部的,这意味着它只能被该文件中的那些人访问。如果没有静态,默认情况下a设置为外部,这意味着定义a的文件内外的人都可以访问它。

请在第5通道进行清理?我还没有那种能力。这是一个问答网站,不是免费的私人咨询网站。如果愿意,您可以请求通过电子邮件通知答案。在这种情况下,由于未指定值,我希望在程序的BSS段中分配空间。这只是加载程序在运行时分配的一块0初始化内存。我不会指望代码中没有初始化的变量在分配时被初始化为0。@pascal,标准§6.7.8/10要求没有初始化器的静态算术变量被初始化为0。