執行結果:#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寄存器中 字符串常量 當前文件 整個程序運行期 數據段