c類的陣列越界

2022-12-19 17:31:13 字數 1019 閱讀 4986

1樓:匿名使用者

樓主的程式存在陣列越限的問題。

當執行a.qput(m);指令前,此時sloc為2,於是,執行sloc++;和q[sloc]=i;結果導致q[3]等於i,也就是等於m。由於q被定義為3維陣列,其下標範圍為0~2,所以訪問q[3]導致陣列越限。

至於為什麼會出現樓主所說的「sloc的值被改變為m」,原因是,在類定義中變數sloc正好出現在q的後面,並且型別都是int,所以執行q[sloc]=i;導致執行q[3]=m,於是給sloc又賦值為m了。程式執行結果出乎意料吧?

建議樓主修改類定義,杜絕陣列越限問題,此現象將自動消失。比如:

1、將下面兩行指令

sloc++;

q[sloc] = i;

修改為q[sloc++] = i;

2、將下面兩行指令

rloc++;

return q[rloc];

修改為return q[rloc++];

確實,通常來說,「陣列越界後, 程式會出現怎麼樣的錯誤是不可**的」,樓主的程式執行,導致「sloc的值被改變為m」,這個結果樓主執行多少次,都是一樣的。其原因主要是就是上述所說的,「在類定義中變數sloc正好出現在q的後面,並且型別都是int」這個條件。

「所以執行q[sloc]=i;導致執行q[3]=m,於是給sloc又賦值為m了。」這麼理解:

1、當sloc為2時,程式呼叫a.qput(m);

2、在方法void queue::qput(int i)中,執行指令sloc++,sloc變為3,於是執行指令q[sloc]=i就變成執行指令q[3]=m了;

3、根據上述條件,由於類成員變數sloc定義出現在變數q的直接後面,也就是說,q[3]相當於陣列變數q後的第3個位置,與變數sloc的儲存位置重合,所以執行q[3]=m就相當於執行sloc=m。

希望樓主能夠理解。

2樓:小豬叄兒

qput是類函式,可以對類變數進行操作啊。

在qput裡不是定義了sloc++;

所以sloc會增加啊。

C陣列負下標的資料型別問題,C 陣列下標的型別問題,這樣為什麼不對,應該在怎麼改?

下標表示從當前位置開始尋找 正負號可以理解成尋找方向 正表示向下找第幾個 負表示向上找 都跟你的指標指向的資料型別相同 c 語言不支援下標為負數的陣列,python語言則支援。c 陣列下標的型別問題,這樣為什麼不對,應該在怎麼改?10 void fun const int n 這裡的n是一個cons...

關於陣列越界問題 char s 5ABCDEchar s 5ABCDE

char s 5 貌似等價於char s 5 越界,char s 5 沒有越界,不過輸錯字串的時候後面會多出一些你無法預料的東西。前一種賦值方法會自動在末尾新增 0 後一種則要把 0 寫進去 我認為第一個有語法錯,第二個不越界。只不過字元陣列沒有以 0 結尾,不能整體輸出 輸出可能出現亂碼 但可以一...

c語言陣列的下標,C語言陣列的下標

樓主你好。注意a是常量,不要被別人誤導了。實際上a是陣列名代表陣列的首地址 注意雖然陣列名和指標都代表地址,但是陣列名不是指標,指標是變數,這個a是常量,可以叫指標常量 而i實際上可以看做陣列中的元素距離陣列首地址的偏移量 距離 a i 就是取距離陣列首元素距離為i的陣列中元素的值,也就是a i 了...