执行结果:#include <stdio.h>
#include <stdlib.h>#include <string.h>int y; 全局未初始化变量 ================> BSS段int f=7; 全局已初始化变量 ================>数据段(data)static int r; 全局未初始化的静态变量 ==========>BSS段static int z=4; 全局已初始化的静态变量 ==========>数据段(data)int main (void) ==================>函数是在内存的 代码段(text) 里分配{static int n; 局部未初始化的静态变量 ==========>BSS段static int m=6; 局部已初始化的静态变量 ==========>数据段(data)auto int i; 局部未初始化的自动变量 ==========>栈auto int j=8; 局部已初始化的自动变量 ==========>栈char *temp; 局部未初始化的自动变量 ==========>栈char *p="it is string at rodata !"; 局部已初始化的自动变量 ==========>数据段的只读段(rodata)printf("n=%d m=%d r=%d z=%d\n",n,m,r,z);printf("y=%d f=%d i=%d j=%d\n",y,f,i,j);temp=malloc(20*sizeof(char)); ============>在 堆 里面分配内存空间;if (temp == NULL) return -1;strcpy(temp,"hello everyone !");printf("p=%s\n temp=%s\n",p,temp);return 0;}
#include <stdio.h>
int main (void){char *ptr = "hello world !" ; // “hello world !”是代表字符串的地址,它本身存储在数据的只读数据段中;char ar[] = "hi everyone !"; // "hi everyone !" 存储在栈上;printf("ptr1 = %s\n ar1 = %s\n",ptr,ar);//*ptr = 'H'; //如果未注销,编译时产生段错误;*ar = 'H';printf("ptr2 = %s\n ar2 = %s\n",ptr,ar);return 0;}
1.作用域角度分,有全局变量和局部变量它们采用的存储类别如下:全局变量:静态外部变量 、外部变量局部变量:自动变量、静态局部变量、寄存器变量2.从变量存在的时间分,有静态存储和动态存储两种类型;静态存储是指程序整个运行时期都存在,动态存储是指程序被调用时被临时分配;静态存储:静态外部变量、静态局部变量、外部变量动态存储:自动变量、寄存器变量、形参变量3.从变量值存放的位置来区分,内存中静态存储区:静态外部变量、静态局部变量、外部变量内存中动态存储区:自动变量、形参变量CPU中的寄存器 :寄存器变量
(1) 对局部变量用static声明,把它分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在。
(2) 对全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。
nstatic对局部变量和全局变量的作用不同:
¨ 局部变量使变量由动态存储方式改变为静态存储方式¨ 全局变量使变量局部化 ( 局部于本文件 ) , 但仍为静态存储方式¨ 从作用域角度看 , 凡有 static 声明的 , 其作用域都是局限的 , 或者是局限于本函数内 ( 静态局部变量 ) , 或者局限于本文件内 ( 静态外部变量 )
1. auto存储类型
auto只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定。因此,auto标识的变量存储在栈区中。
2. extern 存储类型extern用来声明在当前文件中引用在当前项目中的其它文件中定义的全局变量。如果全局变量未被初始化,那么将被存在BBS区中,且在编译时,自动将其值赋值为0,如果已经被初始化,那么就被存在数据区中。全局变量,不管是否被初始化,其生命周期都是整个程序运行过程中,为了节省内存空间,在当前文件中使用extern来声明其它文件中定义的全局变量时,就不会再为其分配内存空间。
声明为register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中,因此访问register变量将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的好几个指令周期。
被声明为静态类型的变量,无论是全局的还是局部的,都存储在数据区中,其生命周期为整个程序,如果是静态局部变量,其作用域为一对{}内,如果是静态全局变量,其作用域为当前文件。静态变量如果没有被初始化,则自动初始化为0。静态变量只能够初始化一次。
字符串常量存储在数据区中, 其生存期为整个程序运行时间, 但作用域为当前文件。
类型 作用域 生存域 存储位置 auto 变量 一对{}内 当前函数 变量默认存储类型,存储在栈区 extern 函数 整个程序 整个程序运行期 变量默认存储类型,代码段
extern 变量 整个程序
整个程序运行期
初始化在data段,未初始化在BSS段 static 函数 当前文件 整个程序运行期
变量默认存储类型,代码段 static 全局变量 当前文件
整个程序运行期
初始化在data段,未初始化在BSS段
static 局部变量
一对{}内
整个程序运行期
初始化在data段,未初始化在BSS段
register变量 一对{}内
当前函数
运行时存储在CPU寄存器中 字符串常量 当前文件
整个程序运行期
数据段