為什麼在c語言中二維陣列第二維下標可以越界

2021-03-10 07:22:40 字數 4141 閱讀 9187

1樓:匿名使用者

因為陣列是連續儲存的,所以a[0][3]就是第四個儲存的資料,你可以試試a[0][4]..

2樓:匿名使用者

越界復是肯定的,但是越界不代表程

制序會出

bai錯,你這個地方越界du後訪問的正好是下一個元素4,是zhi一個dao有效值,所以不會出錯。可以試試訪問a[3][3],這個時候不一定會訪問到什麼東西,這時就很容易出現記憶體破壞,會提示記憶體不可訪問之類的吧

3樓:匿名使用者

不是能越界,c中陣列時從0開始算起的。你是a[3][3],想要顯示對應元素時,就應做相應變換,例版如顯示權

第2行第3列元素(即6),就要寫printf("%d ",a[1][2]);,你寫a[0][3]按照3維陣列來說,沒有這個元素,這時c語言內的編譯器就自動把這個三維陣列預設成一個一維陣列,他顯示的是這個以為陣列的第4個數,即4

4樓:幻夢の初

相當於一維陣列的第四個元素

哥們,往大了試,a[0][9]你試試

5樓:大心星

假設這個陣列是連續記憶體的話,第二個下標越界第一個不越界,那這個內地址還是有可能落在這個二維數容組的記憶體範圍內的,但是你第一維最後元素的第二維下標越界試試? 那就跑出這個陣列的記憶體範圍了,誰這麼明確告訴你可以越界了?

int a[5][5];

a[5][6]=0;

這麼寫或許編譯不報錯,但是你修改了莫名其妙地址上的資料,要麼崩潰要麼出錯...這樣是不可取的

c語言中二維陣列下標問題

6樓:嘟

a可以理解為二重指標,a[0]理解指標,a[0][0]是對這個地址進行訪問了

。其實回[ ]的意義 可以理解成* 。

a[ i ]其實就相當於*(a+i) 所以原答來的就相當於 *(*(a+i)+j) +的優先順序比 *的高 所以外面那個括號可以去掉 就變成了 **(a+i)+j 。

明白了嗎?

7樓:朱豬丹

這裡a指的是整個陣列,而a[0]指二維陣列第一行的元素,a[0][0]指陣列中的第一個元素。

8樓:匿名使用者

a為二重指標,a[0]是指標,a[0][0]是元素,

9樓:匿名使用者

樓上回答的不錯,頂一個。

c語言問題,二維陣列的下標越界怎麼看?

10樓:邰懷蕾範掣

假設bai這個陣列是連du續記憶體的話,第二個zhi下標越界第一個不越界dao,專那這個地址還是屬有可能落在這個二維陣列的記憶體範圍內的,但是你第一維最後元素的第二維下標越界試試?

那就跑出這個陣列的記憶體範圍了,誰這麼明確告訴你可以越界了?

inta[5][5];

a[5][6]=0;

這麼寫或許編譯不報錯,但是你修改了莫名其妙地址上的資料,要麼崩潰要麼出錯...這樣是不可取的

11樓:匿名使用者

定義的時候,數字表示的是數量。

而下標是從0開始的,所以最大下標是總數量減1。

比如int a[10]表示10個數的陣列,它們的下標就是0到9總共10個。

c語言二維陣列下標負數是什麼意思~? 5

12樓:一口沒水的枯井

1 在c語言中,二維陣列的下標可以為負數,表示指向前面的元素

2 對於二維陣列 int arr[m][n]來說,arr[i][j]的地址是 (*arr)+i*n+j,其值是*((*arr)+i*n+j)

3 分析本題

陣列a在初始化時後,其元素按照在記憶體中的排列順序依次為1,2,3,0, 4,5,6,0, 0,0,0,0

陣列a的第一個元素的地址為*a(或&a[0][0]或a[0]),記為p,

則,a[2][-2]的地址就是 p+2*4+(-2) 即p+6,即指向第7個元素,其值為6;

同理,a[1][3]的地址為p+1*4+3,即p+7,即指向第8個元素,其值為0

所以i的值為6

13樓:窗前過馬

在這裡這不是一個錯誤,但是一般不會寫這樣的程式。

首先應該理解語言中陣列的儲存結構。對二維陣列,在記憶體中實際是按行儲存的,也就是說二維陣列中元素是按行依次儲存在一片連續的的空間中。

取某個元素時,是先通過計算這個元素的地址,再通過計算得來的地址取得該元素的。依然以二維陣列為例,設陣列a[rows][cols](即有rows行,cols列),當訪問a[i][j]的時候,是先通過i,j的值計算得到要取的元素的地址,再在這個地址上取得該值的。計算地址的方法是:

a + i*cols + j, 這裡a就是陣列名,它實際存放著上是這個陣列的每一個元素的地址。

因此,對於您的問題, 可能計算得到a[2][-2]的元素地址為 a+2*4 + (-2) = a + 6 = a + 1*4 + 2

它的地址與元素a[1][2]的地址一樣,也就是說a[2][-2]與a[1][2]實際上是同一個元素。因此輸出6,這是正常的現象。

14樓:匿名使用者

著因該是 錯誤的``````

陣列的下標是從0開始的`````

不可能有 -2;

有什麼不懂 你可以給我簡訊```

15樓:匿名使用者

我想那是一個錯誤,這是明顯的陣列越界~ 學這麼長時間c語言,我從來就沒有見過~

16樓:5舍

確實很奇怪,應該是錯的.

17樓:匿名使用者

應該是寫錯了吧。沒見過這樣的

c語言,二維陣列的下標問題問題 10

18樓:008列出

前者可定義的前bai提是給出了全部或部分du元素的zhi值,如arr[100]=,這個時候由於定dao義了列回數,系統會自動在第100個數

答之後換行,而arr[100]=的話就之定義了行數,至於第一行在何處換行就不知道了,因為列寬不知道。

求問個c語言問題,為什麼二維陣列做引數引用時,陣列要填下標,如圖劃線部位。而一維陣列就可以不用填,

19樓:劉文正粉絲

不清楚你學指標沒,如果學了這個問題就好說了.二維陣列是一個二級指標,而一維陣列就是版一個普通的指標權.二維陣列其實也是一維的,只是它的一個元素還是一個陣列.

而一維陣列要得到一個元素可以這樣:*(p+i) 這樣是完全等價於p[i]的.而二維陣列想要得到它其中的一個元素就要這樣:

int i[10][3];

i[1][2] == *(i + 10*1 + 2);

但如果說這個陣列是int i[10][30];就不能通用上面的公式,所以如果得到一個二維陣列的元素就要由型別來定.如上**,i是一個int *[3]型別的.

20樓:匿名使用者

比如一維bai陣列作函式du引數時:f(int a[10]) 會被轉換成f(int *a),zhi即傳遞過去dao的是一維陣列內的首地址。所以即容使你有個陣列 int b[5],也能傳遞進int [10]做引數的函式。

二維陣列作函式引數時:f(int a[10][5]) 後面的那個維數會被丟棄,轉換為,f(int (*a)[10]),

之所以要保留除了第一維以外的維數,是因為int (*a)[10]是一個指向10個int組成的陣列的指標,而不是int* 指標。

這個很難理解的,你必須把指標學好,很多入門的c語言書上會有解釋,想一下就懂是不可能的,慢慢理解。

21樓:寧靜の樂章

二維陣列做形參時可以省略第一個維度,第二個不能省

22樓:蕢廣英計淑

a可以理解為二重

指標,a[0]理解指標,a[0][0]是對這個地址進行訪問了。

其實內[

]的意義

容可以理解成*。a[

i]其實就相當於*(a+i)

所以原來的就相當於

*(*(a+i)+j)

+的優先順序比

*的高所以外面那個括號可以去掉

就變成了

**(a+i)+j

。明白了嗎?

c語言二維陣列迴圈賦值,C語言二維陣列迴圈賦值

這個只是陣列值的大小和行列的關係而已 就代表改數的值等於所在行數的4倍加所在列數加1 c語言中怎樣實現對二維陣列元素進行賦值並輸出。可以按照下面步驟進行定義二維陣列並輸出 1 定義二維指標。2 確定內陣列維數,即行數容和列數。3 申請行數個一維指標大小空間,並賦值給二維指標。4 對於每個一維指,申請...

c語言二維陣列的賦值,c語言有關二維陣列變數初始化

1 首先在電腦上開啟抄c語言程式設計軟襲件。然後建立專案。2 然後匯入stdio.h和stdlib包。再加入malloc包。3 然後定義五個引數。再建立其中兩個引數的空間。4 然後用for語句進行迴圈。再用scanf語句進行接收輸入到二維陣列。5 然後用兩個for語言迴圈。再輸出二維陣列的數值。6 ...

c語言中二維陣列a的地址為什麼可以表示成

依據 c語言深度剖析 多維陣列與多級指標 章節 原文如下 以陣列下標的方式來訪問其中的某個元素 a i j 編譯器總是將二維陣列看成是一個 一維陣列,而一維陣列的每一個元素又都是一個陣列。a 3 這個一維陣列的三個元素分別為 a 0 a 1 a 2 每個元素的大小為 sizeof a 0 即 siz...