ANSI/ISO C之前,對數組的一次性初始化必須要求數組被聲明為靜態的,樓上說static和extern與變數的使用范圍有關,沒錯,但不是這里要使用的含義,這里靜態(全局變數默認為靜態的)指的是該變數只初始化一次。全局變數肯定是只初始化一次的,所以這主要是針對函數塊裡面聲明的變數來說的,就是說在函數塊裡面聲明的靜態局部變數,只在第一次進入這個函數塊的時候才進行初始化。ANSI/ISO C允許對聲明的非靜態數組也進行一次性初始化。所以在支持ANSI/ISO C標準的編譯環境下,函數塊內寫
static int a[3] = { 2, 4, 5 };
和
int a[3] = { 2, 4, 5 };
都對。
函數塊外面寫static時才是樓上所說的變數的適用范圍,不加static聲明出來的變數的范圍可以在文件之間,加了static聲明的變數則只在該文件內。但此時,你加不加static都不會影響你寫int a[3] = { 2, 4, 5 };因為這個時候a是全局變數,默認的是靜態的,這樣的初始化當然沒有問題的。
另外,這種一次性初始化必須在定義一個變數的時候才是允許的。這一點,樓主要謹記,不管是ANSI/ISO C還是C99都是不允許出現
int a[3];
a[3] = { 2, 4 , 5 }
的,不管有沒有static修飾。如果你不想在定義的時候初始化,那就只有等到你需要的時候通過賦值操作來進行,數組當然得通過循環
② 什麼是靜態數組有什麼作用請具體介紹。
靜態數組 static 與 「動態」auto 的區別在於 編譯器為兩者分配的內存不一致 static型會一直存在於內存中 而AUTO型的只有在調用編譯器才給分配內存 所以當定義一個局部變數數組是 只有static型的才能初始化。不過ANIC c標准好像auto也能初始化了
③ c語言外部與局部數組
我想說,你自己已經找到問題的關鍵了,卻好像倒在了最後一步...
你為什麼要列印printf("\n%d,%d",i,j);這句話呢?難道你不正想要看看i和j是什麼值嗎?
來看看我機器上你的程序運行結果:
1. 當a是全局變數時,程序跑到一半報錯,這時候i,j都遠遠大於6和8這兩個值。
2. 當a是main函數的局部變數時,程序比之前出錯的更快。最後時刻的i,j的值分別為6,8
很明顯,你的程序寫錯了,使得你想好只有6行8列的數組最後需要訪問到第7行第9列這樣越界的地方。如果你像我一樣看到了以上的結果,那麼你顯然不應該認為(1)是對的,因為你可以看到i,j下標越界,只不過程序沒有拋錯,這個的原因可能是c++編譯器對待函數局部棧上的數據,和對待全局變數的不同。但是你不能將你的程序的正確性依賴於編譯器對待數組越界的處理策略。
④ c語言中,分配的靜態數組,如何釋放內存
全局數組在程序運行結束時自動釋放。
函數內定義的數組在函數退出時自動釋放。
C/C++沒有提供人為釋放辦法。
⑤ c語言結構數組,如何創建外部數組和靜態數組
外部變數就是引用外部文件的變數(非靜態)
靜態變數與全局變數相似,區別是靜態變數只能在定義的函數內被調用。
靜態變數與局部變數區別:靜態變數不會自動釋放,函數調用結束後,值依然保留。靜態變數定義時賦初值,只有一次,多次調用函數,不會反復賦初值。如果沒有初值,靜態變數也會自動賦初值。
關於數組定義在棧中維度大小受限,想要定義在堆中,可以用malloc申請。
詳細看我寫的案例備注吧。
//externFile.c文件
#include<stdio.h>
structbook2
{
intid;
};
structbook3
{
intid;
};
structbook2bk2;
staticstructbook3bk3;//b3是靜態全局變數,無法通過extern被外部調用
⑥ C語言,請問 如果一個函數中我定義一個局部static字元數組,如果我不停的調用這個函數。
static靜態變數分配在全局變數(靜態變數)區內,這是在編譯環節中就會確定的。
如果在程序的一個函數中定義一個局部static字元數組的話,那麼這個static字元數組的生存期是整個程序運行時期,即在一個程序運行周期內,它使用的都是同一塊地址而且是同一個物理地址。
程序結束後,自動釋放。
⑦ c語言數組的定義
C語言支持一維數組和多維數組。如果一個數組的所有元素都不是數組,那麼該數組稱為一維數組。
在C語言中使用數組必須先進行定義,一維數組的定義方式為:類型說明符; 數組名 ;[常量表達式]。
其中,類型說明符是任一種基本數據類型或構造數據類型。數組名是用戶定義的數組標識符,方括弧中的常量表達式表示數據元素的個數,也稱為數組的長度。例如:
int a[10]; /* 說明整型數組a,有10個元素 */
float b[10], c[20]; /* 說明實型數組b,有10個元素,實型數組c,有20個元素 */
char ch[20]; /* 說明字元數組ch,有20個元素 */
對於數組類型說明應注意以下幾點:
1、數組的類型實際上是指數組元素的取值類型。對於同一個數組,其所有元素的數據類型都是相同的。
2、數組名的書寫規則應符合標識符的書寫規定。
3、數組名不能與其它變數名相同。例如:
int a;
float a[10];
是錯誤的。
4、方括弧中常量表達式表示數組元素的個數,如a[5]表示數組a有5個元素。但是其下標從0開始計算。因此5個元素分別為a[0], a[1], a[2], a[3], a[4]。
5、不能在方括弧中用變數來表示元素的個數,但是可以是符號常數或常量表達式。例如:
#define FD 5
// ...
int a[3+2],b[7+FD];
是合法的。但是下述說明方式是錯誤的。
int n=5;
int a[n];
6、允許在同一個類型說明中,說明多個數組和多個變數。例如:
int a,b,c,d,k1[10],k2[20];
(7)c語言局部靜態數組擴展閱讀:
C語言是一門通用計算機編程語言,廣泛應用於底層開發。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標准局為C語言制定了一套完整的美國國家標准語法,稱為ANSI C,作為C語言最初的標准。[1]目前2011年12月8日,國際標准化組織(ISO)和國際電工委員會(IEC)發布的C11標準是C語言的第三個官方標准,也是C語言的最新標准,該標准更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。
C語言是一門面向過程的計算機編程語言,與C++,Java等面向對象的編程語言有所不同。
其編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
⑧ C語言靜態數組
通俗的說靜態數組就是在定義數組的時候,由操作系統分配的空間,比如
int
a[10];
這就是在定義時由系統給你分配了10個int類型的空間,這個空間是可以初始化的,比如
int
a[10]
=
{1,
2,
3,
4,
5,
6,
7,
8,
9,
10};
那麼在這個定義之後,系統會首先分配10個int類型的存儲空間,然後把大括弧裡面的數字分別的,按順序放到這10個空間里。你所做的只是寫這么一句,而數組賦值的操作就由系統完成了。當然,初始化與否看你的需求,初始化不是強制性操作,想初始化就初始化,不想也沒問題,還是上面的例子繼續:
int
a[10];
這里定義了,但是沒初始化,這沒有任何問題,以後你可以自己往裡面賦值,比如
a[1]
=
8;
a[5]
=
3;
或者
for(int
i
=
0;
i
<
10;
i++)
a[i]
=
i;
等等
對於動態數組,不能被初始化,因為動態數組在定義時只是個指針,比如
int
*a;
這里變數a只是個指向int類型的指針,而不是數組。動態分配有10個int類型元素的數組,如下:
a
=
(int)
malloc(10*sizeof(int));
很明顯,指針a在定義的時候不能被初始化,比如這樣寫就是錯誤的:
int
*a
=
{1,2,3,4,5,6,7,8,9,10};
/*
錯誤!
*/
因為a是只有4個位元組的指針,沒有可用的存儲空間給需要初始化的變數。
所以,靜態數組從語法上來說允許被初始化。作為程序員來說,你可以初始化靜態數組,也可以不初始化,由你決定。
⑨ C語言——局部靜態變數的問題
其實是這樣的。靜態變數在內存中存儲的位置,與全局變數是同一個區域。
所以,在編譯期間,它的存儲和大小就已經確定了,也就是已經分配了空間了。
而在c語言中,「分配內存」往往看做是變數被定義的一個標志。
所以,你在運行程序的時候,由於靜態變數已經分配過內存了,不會再次進行分配了,它的定義語句就不會再次被執行了。
⑩ C語言中靜態數組與動態數組
c是一個int指針變數,這個變數保存了一個地址,c+i也是一個int指針,和c相比偏移了i個int大小(一般4或8位元組)
c[i]是c+i處的int變數,等價於*(c+i)
數組的名字就是數組的名字,