關於C語言陣列的定義問題

2021-08-02 03:09:30 字數 1133 閱讀 6762

1.

c語言的陣列定義其實是乙個指標的trick,事實上:

a[3] == *(a+3) == *(3+a) == 3[a]

這說明c語音的陣列資訊中,並沒有陣列長度的資訊,只有兩個位址(也就是a和(a+3))。所以c語言沒辦法判斷乙個陣列是否越界。

但這並不代表我們就沒有必要判斷陣列是否越界或者說去遵循陣列定義時的大小,在編譯的時候,系統會給陣列乙個規定長度的專用空間來,如果你超過了這個空間,那麼就會影響到其他的資料,你的程式很可能會出錯, 比如:

#include

main()

; int b[3] = ;

printf("改變前\n");

for(int i = 0; i < 10; i++) {printf("%d ",*(a+i));}

printf("\n");

for(int i = 0; i < 10; i++)

printf("\n");

b[5] = 33;

printf("改變後\n");

for(int i = 0; i < 10; i++) {printf("%d ",*(a+i));}

printf("\n");

for(int i = 0; i < 10; i++)

}

這個**的輸出是:

可以看到,這裡系統給a陣列分配的空間剛好就在b陣列的後面兩位。如果我超過b陣列的定義長度,改變*(b+5)的值為33,那麼這個時候a陣列中,第二個數的值就從2被改變成了33。這樣就容易造成錯誤。

2.

c99中有變長陣列,你可以這樣使用它:

#include

main()

值得注意的是,這樣使用的時候,a[n]不能初始化,至少初始化的長度不可以比n大,不然就會出錯。以及,變長陣列只能是自動分配的型別,也就是說它只能在函式內部或者是在函式的引數中宣告,並且它也不能為靜態變數。 原因就是,在編譯的時候系統無法確定要分配的專用空間的大小。

關於C語言陣列

學習了陣列這一塊,越發的想把知識做乙個整理。哎,所以這篇文章只是個知識整理文。ahhhhhh 1 一維陣列 定義1.一維陣列的定義格式為 型別說明符 陣列名 常量表示式 例如 int a 10 它表示定義了乙個整形陣列,陣列名為a,有10個元素。2.在定義陣列時,需要指定陣列中元素的個數,方括弧中的...

c 語言,關於陣列

1 賦值,定義 聚合型別 陣列,結構體 聚合型別如果只初始化一部分,那麼剩餘部分則為0,下面有例項 初始化含義 在定義時直接賦值 include int main int a 10 int b 10 int arr 10 這個陣列長度為10,定義此陣列為整型 arr 3 10 在arr這個陣列中下標...

關於C語言中定義結構體問題

1 c語言中定義結構體的語法是 struct 結構體名 2 在定義了結構體以後,要想使用該結構體,還需要進行結構體變數的宣告,才能在程式中使用該結構體,c語言中定義結構體變數的語法是 1 struct 結構體名 結構體變數名 另外也可以在定義結構體的時候,直接在後面宣告結構體變數,如下的形式 2 s...