C語言陣列初始化

2021-09-09 02:41:16 字數 2308 閱讀 9416

wchar_t wname[128]=;

char cname[256]=;

我感興趣的是:

1. 這種賦值的結果。

2. 這種形式是否符合標準編碼規則?

我找到了如下資料,可能有助於對這個知識點的掌握。 /*

初始化值的個數可少於陣列元素個數。當初始化值的個數少於陣列元素個數時,前面的按序初始化相應值,後面的初始化為

0(全域性或靜態陣列

)或為不確定值

(區域性陣列)。

*/ 我相信上面的資料是c和

c++語言的標準規範,但實際編譯器處理時,可能會和規範有所不同。因為編譯器原則上要遵從語言規範,但對於區域性陣列的不確定值到底是多少,怎麼處理,編譯器就可以靈活處理。我測試了三種編譯器,其實編譯器賦予的值是固定的,都是0。

*/ 一直以為

int a[256]=;是把a

的所有元素初始化為0,

int a[256]=;是把a

所有的元素初始化為1。

除錯的時檢視記憶體發現不是那麼一回事,翻了一下《

the c++ programming language

》總算有定論。

陣列初始化

陣列可以用乙個列值來初始化,例如

int v1 =;

char v2=;

當陣列定義時沒有指定大小,當初始化採用列表初始化了,那麼陣列的大小由初始化時列表元素個數決定。所以v1和

v2分別為

int[4]

和char[4]

型別。如果明確指定了陣列大小,當在初始化時指定的元素個數超過這個大小就會產生錯誤。例如:

char   v3[2] =;   //

錯誤:太多的初始化值了

char   v3[3] =;   //正確

如果初始化時指定的的元素個數比陣列大小少,剩下的元素都回被初始化為

0。例如

int   v5[8]=;

等價於int   v5[8]=;

注意沒有如下形式的陣列賦值:

void f()

;   //

錯誤:不是陣列賦值 }

如果你想這樣的複製的話,請使用

vector

或者valarray。

字元陣列可以方便地採用字串直接初始化,

char   alpha ="abcdefghijklmn";

下面來看乙個例子:

#include 

int array1[5]=;

static int array2[5]=;

void main() ;

static int arr2[5]=;

int n;

cout <

for(n=0; n<5; n++)

cout <

cout <

for(n=0; n<5; n++)

cout <

cout <

for(n=0; n<5; n++)

cout <

cout <

for(n=0; n<5; n++)

cout <

cout < }

在這個例子中,全域性和靜態陣列都按語言規範要求被初始化為

0,但是區域性陣列並沒有向前面所說的為不確定值,下面是用

gcc,

vc6.0

,tuborc++

分別編譯的結果(

gcc用

g++編譯

c++檔案

這說明了對區域性陣列沒有初始化的元素的值,這幾種編譯器都將其設定為

0。但是,如果不對陣列進行初始化,即在定義的同時沒有用列表初始化,那麼區域性陣列的值就取決於編譯器而對程式設計師來說就是不可預料的了。有時間可以測試一下各個編譯器,不過在

vc中是

0xcc

,所以對區域性陣列的初始化要特別小心。但是全域性的陣列和靜態陣列還是會被正確的賦於

0值的。

C語言陣列初始化

陣列宣告時必須指明陣列元素的資料型別以及陣列中元素個數,計算機才可以為陣列預留出足夠的空間。陣列大小必須為常量。define size 10 int a 12 int b 100 c size 可以在宣告時通過初始值列表實現陣列元素初始化 int a 3 如果初始值列表中提供的元素個數少於陣列元素個...

c語言 柔性陣列初始化

在做專案時,遇到相似結構,差異在乙個成員,這個成員想表達可變陣列,資料結構如下 struct a struct b 目的 合併兩個結構,用同乙個結構表達 初始化變數,或陣列 首先合併ab兩個結構不難,可以使用柔性陣列 struct ab 這樣可以初始化成員 struct ab var 問題似乎解決,...

C語言 陣列指標初始化

char m 3 4 m 3 4 當然不行,不管從初始化器,還是從原理上來講都不正確,首先a 3 4 表示的是陣列中第4行第5個元素,請問,可以對陣列中具體的乙個元素賦這麼長一串值嗎?所以不能這樣賦值。第一種寫法是屬於初始化,初始化會自動為陣列中的每乙個元素賦正確的值。陣列指標初始化方法 int p...