【知识点】——static补充

static 声明的变量,不管它是全局变量也好,还是在函数之中的也好,只要是没有赋初值
都存放在.bss段,如果赋了初值,则把它放在.data段。

++++++++++++++++++++++++

a.h的内容
static int g_count = 0;
void AddCount(int count);

a.c的内容
#include “a.h”
void AddCount(int count)
{
g_count += count;
printf(“the addr of g_count in AddCount = 0x%llx\n”, &g_count);
}

b.c的内容
#include “a.h”
void IncreCounter(void)
{
g_count++;
printf(“the addr of g_count in IncreCounter = 0x%llx\n”, &g_count);
}
int main(void)
{
printf(“Init =%d\n”, g_count);
IncreCounter();
printf(“IncreCounter =%d\n”, g_count);
AddCount(19);
printf(“Init =%d\n”, g_count);
return 0;
}
在b.c执行main函数,输出:init=0 IncreCounter=1 int=1

b.c 包含了a.h, 所以g_count作用范围只在b.c中。a.c里AddCount中的g_count作用范围也只是a.c,b.c和a.c中的g_count其实是两个不同的值,它的内存地址不一致。

+++++++++++++++++++++++++++

char* GetMemory1(void) {
char str[] = “Hello World!\r\n”;
return str;
}

char* GetMemory2(void) {
char* str = “Hello World!\r\n”;
return str;
}

char* GetMemory3(void) {
static char str[] = “Hello World!\r\n”;
return str;
}

int main() {

char* str1 = GetMemory1();
char* str2 = GetMemory2();
char* str3 = GetMemory3();

if (str1 == NULL) {

}
else {
	printf("%s", str1);
}

system("pause");
return 0;

}
以上代码输出什么:
str1:输出不确定,GetMemory返回了栈地址,函数调用完成后,栈地址会消亡,此时在继续访问栈地址会出现各种无法预想的结果。
str2: 输出hello world

这道题目和上一道题目非常相像,唯一不同的是在本题中GetMemory中pcBuf指向的是字符串常量地址,属于静态内存,函数退出后依然可以访问,而上一道题目pucBuf指向的却是栈地址,函数退出后无法继续访问。
str3:输出hello world

这道题目和上一道题目非常相像,唯一不同的是在本题中GetMemory中pcBuf是静态内存,函数退出后依然可以访问。

发布了44 篇原创文章 · 获赞 1 · 访问量 904

猜你喜欢

转载自blog.csdn.net/weixin_42268479/article/details/105529953