在C語言中 int a 10 指數組有10個元素,a 9 表示第十個元素,那a 10 去哪了呢求教

時間 2021-06-06 13:55:57

1樓:

如果是這麼寫:int[10] a

表示有一變數a有10個int,然後記住取a中元素時是從0開始就行了,a[0]-a[9]

你的困惑是為什麼寫的時候出現了a[10]這個東西,用的時候沒有。這是C的設計問題,本來正確設計方式應該開頭那種,自始至終就沒有a[10]。

類似的坑還有指標的宣告方式:int* p和int *p哪種好理解呢?

2樓:醉臥沙場

編譯器:好的,已為您準備好了 a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]。

你:嗯?我要十個數,你為什麼不給我a[10]? 我就要a[10]!我就要用a[10]!

系統:Segmentation fault……其實實際上如果你寫:

int a[10];

a[10] = 1;

#include

intmain

(int

argc

,char

*argv

)編譯執行:

$ gcc -o mytest mytest.c -Wall$ ./mytest

a[1000] = 1

但是如果我寫的再大點,比如把1000換成10000,可能就不行了:

$ gcc -o mytest mytest.c -Wall$ ./mytest

Segmentation fault (core dumped)其實這樣才是最麻煩,在程式設計時如果一有一丁點越界就馬上Segment fault其實是最好的,否則這種問題就將被隱藏下來,在不一定什麼條件下觸發非常詭異的很難除錯和追蹤的bug。在乙個碩大的專案裡,這樣的問題是很致命的。

3樓:溫情

忘記了是在哪看到的了.

但是我覺得可以換個方式去理解陣列.

a我們知道是陣列名,其中儲存了陣列的起始位址。

方框中的數字,通常書上都稱之為「下標」,從0開始到n-1是表示範圍...可是為什麼要從0開始呢。

換個方法來理解,我們將方框中的數字稱之為「偏移量」。

也就是說,我們將a[0]稱為:陣列a的位址偏移0個int型別的長度。

所以取得的就是陣列中第1個int型別的值。

以此類推,陣列的最後乙個int型別的值,就是a[n-1]了。代表陣列偏移n-1個int型別的長度。

舉例說明,假設:

int a[50];

我們假設陣列的起始位址分配為0。通常乙個int型別4個位元組。50個長度的陣列就是200個位元組。

也就是說,我們定義的陣列的位址範圍是0-200。

那麼a[0]表示偏移量為0個int型別。假設有乙個東西(學到後面你會知道有個東西叫指標)。指向陣列的起始位址,也就是0。那麼a[0就是]:

起始位址 + 0×int型別的長度=偏移後的起始位置

也就是說a[0]的起始位址為0,長度為4。0 1 2 3這四個位址都是用來存放它的。

以此類推,直到a[49]=196.

196 197 198 199用來存放a[49]

那麼a[50]=200。很明顯超出範圍了。自然就溢位了。

4樓:文命

int a[10];//申明 a有10個int的大小

10個int的大小,眾所周知,計算機從0開始計數,0--9,剛好10個數。 a[10]那是第11個元素了。越界警告

C語言中while(a 10) 和while(a 10) 有什麼區別?

勝勳 區別很大 假如之前 a的值是5,那麼 while a 10 可以執行,因為a已經變成了10,滿足條件 while a 10 不執行,因為a是5,不等於10,所以不滿足條件 zhangxiaoyang 這個區別?int b1 a 1 int b2 a 1 while b1 while b2 fo...

在C語言中, a N 與 a N 有什麼區別?

知了 剛好有看過這裡,嘗試著回答一下。這其實和C語言運算子優先順序有關,弄懂這一點就會比較清楚,這裡涉及兩個運算子,下標引用和間接訪問 下標引用運算子優先順序高於間接引用,所以 a N 首先是乙個陣列,而陣列的元素是指標 加上小括號之後,即在 a N 中,要先進行 運算,所以a是乙個指標,指向乙個具...

在C語言中,如何安全地使用void ?

Lvcs 靈活接收資料型別,可以試試使用巨集定義而不用函式 舉個例子 判斷兩個數哪個大 define MAX a,b a b a b 使用巨集定義可以靈活接收各種型別的 a b,而使用函式判斷的話就需要事先設定傳入引數的型別了。 劉燦 傳遞指標同時提供區域長度 不用0來標識字串或區域結束 以typd...