搬運 C 下標越界後

2021-09-17 20:42:16 字數 1648 閱讀 9343

【搬運】因為原來的部落格要關,所以從原來的部落格搬運過來。

最近遇到乙個很奇怪的問題,在arm-linux下發現乙個bug,用windows版驗證也有這個問題,後來查到原因是下標錯了,多加了1,後來修復了這個bug。可是測試人員在驗證新版本時告訴我,原版本沒有這個問題。後來了解到,該測試人員測試的額x86-linux版本。確實沒有出現這個bug。這就奇怪了,肯定是用錯了,肯定是下標加了個1。怎麼會沒問題呢。

遇到的bug抽象出來的示例**如下:

#include

bool aa[5]=;

bool bb[5]=;

int main()

這段**執行後結果是什麼呢?

這裡的錯誤在於aa變數下標越界了,執行後的結果卻有點出人意料。

在windows下編譯後執行,結果為false

在arm-linux下編譯執行,結果為false  

這兩個就是我的程式出現bug的現象,本來想用aa[4],結果用成了aa[5],所以結果不是true。

但是,在x86-linux下編譯執行,結果是true。這也就是測試人員為什麼告訴我原版本沒有問題的原因。結果是true啊。

冷靜下來分析了一下。用了下面的測試**執行後就一目了然了。

#include

bool aa[5]=;

bool bb[5]=;

int main()

下面是windows下和arm-linux下執行的結果

aa[0]=0

aa[1]=0

aa[2]=1

aa[3]=0

aa[4]=1

aa[5]=0

aa[6]=0

aa[7]=0

aa[8]=1

aa[9]=1

aa[10]=1

aa[11]=1

aa[12]=1

aa[13]=0

aa[14]=0

aa[15]=0

aa[16]=0

aa[17]=0

aa[18]=0

aa[19]=0

而在x86-linux下的執行結果如下:

aa[0]=0

aa[1]=0

aa[2]=1

aa[3]=0

aa[4]=1

aa[5]=1

aa[6]=1

aa[7]=1

aa[8]=1

aa[9]=1

aa[10]=0

aa[11]=0

aa[12]=0

aa[13]=0

aa[14]=0

aa[15]=0

aa[16]=0

aa[17]=0

aa[18]=0

aa[19]=0

不同的編譯器對於全域性變數的儲存方式是不同的,windows各個陣列是位元組對齊的,而x86-linux卻是緊密排列的,所以第乙個陣列越界的指標指向了第二個陣列。

ps,各個平台下編譯器版本:

windows下vs2010

編譯arm-linux的編譯器版本arm-linux-gnueabi-g++ (ubuntu/linaro 4.6.3-1ubuntu5) 4.6.3

編譯x86-linux的編譯器版本g++ (gcc) 4.4.7 20120313 (red hat 4.4.7-17)

C陣列下標越界

之前總聽說c語言的各種毛病,今天算是遇到乙個 陣列下標越界 兩段完成不相干的 一段是測溫度的,一段是測轉速的。兩段 單獨執行都沒有問題,但是若執行測轉速的 測溫度的資料就會發生錯誤。一步檢視,發現執行測轉速之後,測溫度的 中的乙個變數和乙個資料的值就會發生詭異的錯誤 陣列下標越界 這個越界非常不明顯...

陣列下標越界

原理 因為c語言不會檢測陣列下標,所以如果我們給陣列乙個超出它大小的下標,就會照成陣列越界。如果是想陣列中寫入資料的話,就會造成資料寫入到不屬於陣列的地方,或者說如果讀取資料的話,就會讀取到別的地方的資料。因為陣列位址是自低往高增長,而棧的位址是自高向下降低,所以如果我們將陣列下標根據棧內的空間的分...

python 下標越界 Python中異常處理

高階語言通常都配置了一套try.except.finally的錯誤處理機制。1 我們先看乙個try的機制 try res 1 0 except zerodivisionerror as e print 出錯了,除數不能為0 e 執行結果為 出錯了,除數不能為0 division by zero 當我...