c語言靜態局部變數
C語言中的局部變數存儲在棧里。
普通的局部變數在棧空間上分配,這個局部變數所在的函數被多次調用時,每次調用這個局部變數在棧上的位置都不一定相同。局部變數也可以在堆上動態分配(malloc),但是記得使用完這個堆空間後要釋放之。
在棧空間上分配時是要注意內存的,不能分配內存過大。如果棧內空間小於所申請的空間大小,那麼這時系統將揭示棧溢出,並給出相應的異常信息。但是堆不一樣,堆可分配空間是很大的。
(1)c語言靜態局部變數擴展閱讀
局部變數分類
1、位置:靜態局部變數被編譯器放在全局存儲區.data,所以它雖然是局部的,但是在程序的整個生命周期中存在(定義時出生,隨著程序結束而結束)。
2、訪問許可權:靜態局部變數只能被其作用域內的變數或函數訪問。也就是說雖然它會在程序的整個生命周期中存在,由於它是static的,它不能被其他的函數和源文件訪問。
3、值:靜態局部變數如果沒有被用戶初始化,則會被編譯器自動賦值為0,以後每次調用靜態局部變數的時候都用上次調用後的值。
2. C語言中靜態局部變數的問題
靜態局部變數相當於全局變數(只是只有在這個函數中能訪問,但是生命周期是和全局變數差不多的),函數退出之後變數還在,而且只在第一次進入的時候做初始化,以後會跳過初始化語句,保留原來的值(也就是說,如果item是static的,那麼只有在第一次進入這個函數的時候會執行item=0,以後都不會執行。)。
3. C語言用靜態局部變數來實現
簡單跟你說說吧,靜態變數是放靜態區的,程序結束後os會自動回收內存的,不用你操心。而局部變數不用我說了吧,簡單理解成:在大括弧中的都是局部變數,放棧區,static是靜態變數的標示符。{
static
int
a=0,b=2;
static
int
sum=0,i;
};
這里的a,b,sum,i都是靜態局部變數。如果你不寫static的話,就是動態局部變數(默認就是動態的),或者你寫auto也是動態局部變數。執行到大括弧末尾的時候,這幾個變數會從內存中消失的。
如果你不是寫在大括弧中,而是寫在外面的,就是全局變數,加上static就是私有的全局變數。
其實你這個問題問得挺幼稚的。。。。
滿意請採納,謝謝
4. C語言中的靜態變數
用static聲明的變數是靜態變數,比如static int a =4;這個a的初始值為4(僅僅是初始值),並且這個變數是一直存在的。
幾個a並不是同一個a,我們可以把程序中的a改一下名字,方便理解。如下:
#include <stdio.h>
int fun(int n)
{
static int a =3;
int t =0;
if(n%2)
{
static int b =4;
t+=b++;
}
else
{static int c =5;
t+=c++;
}
return t+=a++;
}
main()
{
int i,s=0;
for (i=0;i<3;i++)
s+=fun(i);
printf ("%d ",s);
}開始在稿紙上分析。
5. C語言中的靜態局部變數的定義
簡單跟你說說吧,靜態變數是放靜態區的,程序結束後OS會自動回收內存的,不用你操心。而局部變數不用我說了吧,簡單理解成:在大括弧中的都是局部變數,放棧區,static是靜態變數的標示符。{
static int a=0,b=2;
static int sum=0,i;
};
這里的a,b,sum,i都是靜態局部變數。如果你不寫static的話,就是動態局部變數(默認就是動態的),或者你寫auto也是動態局部變數。執行到大括弧末尾的時候,這幾個變數會從內存中消失的。
如果你不是寫在大括弧中,而是寫在外面的,就是全局變數,加上static就是私有的全局變數。
其實你這個問題問得挺幼稚的。。。。
滿意請採納,謝謝
6. c語言中靜態變數是怎麼用的
c語言中靜態變數作常量使用,用於存儲常數。可用const,constant或final等關鍵字標識,其值就會在編譯時設定,並且無法在運行時改變。編譯器通常將靜態常量與文本一起置於目標文件的文本區域,而非常量初始化數據則置於數據區;而如若有需要,有些編譯器還可選擇為其開辟專用區。
對於靜態全局變數來說,針對某一源文件的以static聲明的文件級變數與函數的作用域只限於文件內(只在文件內可見),也即「內部連接」,因而可以用來限定變數的作用域。
(6)c語言靜態局部變數擴展閱讀:
在函數內以static聲明的靜態局部變數雖然與自動局部變數的作用域相同(即作用域都只限於函數內),但存儲空間是以靜態分配而非默認的自動分配方式獲取的,因而存儲空間所在區域不同。
一般來說,靜態分配時存儲空間於編譯時在程序數據段分配,一次分配全程有效;而自動分配時存儲空間則是於調用棧上分配,只在調用時分配與釋放,且兩次調用間變數值始終保持一致;必須注意,靜態局部變數只能初始化一次,這是由編譯器來保證實現。