C变量存储空间、作用域、生命周期
变量分类:
1.全局变量
2.全局静态变量
3.局部变量
4.局部静态变量
5.寄存器变量 register
变量类型 | 作用域 | 存储空间 | 生命周期 |
全局变量 | 整个程序可见 | 静态区(./data./bss) | 整个程序运行期间 |
全局静态变量 | 整个程序可见 | 静态区(./data./bss) | 整个程序运行期间 |
局部变量 | 函数内部 | 栈 | 函数执行期间 |
局部静态变量 | 整个程序可见 | 静态区(./data./bss) | 整个程序运行期间 |
寄存器变量 | 函数内部 | 寄存器 | 函数执行期间 |
int a = 0; // 全局变量 char *p1; // 全局变量 static int x = 10; // 全局静态变量 void func(void) { int b; // 局部变量 char s[] = "123"; // 局部变量 “123”为常量 char *p2; // 局部变量 char *p3 = "hello world"; // 局部变量 "helo world"为常量 static int c = 0; // 局部变量 register int i = 0; // 局部变量 p1 = (char *)malloc(128); // p1指向堆上内存 p2 = (char *)malloc(256); // p2指向堆上内存 free(p1); // 释放内存 free(p2); // 释放内存 } int main() { func(); printf("hello world\n"); return 0; }
变量或常量 | 存储空间 | 作用域 | 生命周期 |
a | 静态区(.data) |
整个工程 extern int a |
整个程序结束 |
p1 | 静态区(.bss),指向的内存在堆上 |
整个工程 extern char *p1 |
整个程序结束,指向的内存需要free释放 |
x | 静态区(.data) | 当前文件 | 整个程序结束 |
b | 栈 | func函数 | func函数结束 |
s | 栈 | func函数 | func函数结束 |
p2 | 栈,指向的内存在堆上 | func函数 | func函数结束,指向的内存需要free释放 |
p3 | 栈 | func函数 | func函数结束 |
c | 静态区(.data) | func函数 | 整个程序结束 |
i | 可能是寄存器或栈 | func函数 | func函数结束 |
"123", "hello world" | 静态区(.rdata) | 整个程序结束 |