比如數(shù)組定義時(shí)有十個(gè)元素,那么a[0] ?-- a[9] 分別對應(yīng)相應(yīng)的元素,在程序中如果使用了a[10]那么就超出了原來的數(shù)組定義的范圍,這就是數(shù)組下標(biāo)越界。
成都創(chuàng)新互聯(lián)公司成立于2013年,先為景寧畬族自治等服務(wù)建站,景寧畬族自治等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為景寧畬族自治企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
c和c++語言中數(shù)組下標(biāo)越界,編譯器是不會(huì)檢查出錯(cuò)誤的,但是實(shí)際上后果可能會(huì)很嚴(yán)重,比如程序崩潰等,所以在日常的編程中,程序員應(yīng)當(dāng)養(yǎng)成良好的編程習(xí)慣,避免這樣的錯(cuò)誤發(fā)生。
擴(kuò)展資料
VB中的數(shù)組越界
12、引用了不存在的數(shù)組元素
下標(biāo)可能比下標(biāo)范圍大或小,或是在應(yīng)用程序中這一邊的數(shù)組沒有指定范圍。檢查數(shù)組的聲明以確認(rèn)其上界和下界。若使用的是重新指定范圍的數(shù)組,應(yīng)使用 UBound 和 LBound 函數(shù)來決定數(shù)組訪問。如果索引指定為變量,應(yīng)檢查變量名的拼寫。
聲明數(shù)組時(shí)沒有指定元素的數(shù)目。例如,下列的代碼就會(huì)導(dǎo)致此錯(cuò)誤:Dim MyArray() As Integer
MyArray(8) = 234 ' 導(dǎo)致錯(cuò)誤 9。Visual Basic 并不會(huì)將沒有指定范圍的數(shù)組自動(dòng)設(shè)為 0 – 10。相反必須使用 Dim 或 ReDim 來指定數(shù)組中元素的數(shù)目。
2、引用了不存在的集合成員。
試著使用 For Each...Next 結(jié)構(gòu)代替指定元素下標(biāo)。使用速寫形式的下標(biāo),結(jié)果指定了錯(cuò)誤的元素。
1、什么是數(shù)組訪問越界?
我們通過數(shù)組的下標(biāo)來得到數(shù)組內(nèi)指定索引的元素。這稱作對數(shù)組的訪問。
如果一個(gè)數(shù)組定義為有n個(gè)元素,那么,對這n個(gè)元素(下標(biāo)為0 到
n-1的元素)的訪問都合法,如果對這n個(gè)元素之外的訪問,就是非法的,稱為“越界。
數(shù)組占用了一段連續(xù)的內(nèi)存空間。然后,我們可以通過指定數(shù)組下標(biāo)來訪問這塊內(nèi)存里的不同位置。因此,當(dāng)你的下標(biāo)過大時(shí),訪問到的內(nèi)存,就不再是這個(gè)數(shù)組“份內(nèi)”的內(nèi)存。你訪問的,將是其它變量的內(nèi)存了。
2、訪問越界會(huì)出現(xiàn)什么結(jié)果?
首先,它并不會(huì)造成編譯錯(cuò)誤!就是說,C,C++的編譯器并不判斷和指出你的代碼“訪問越界”了。一個(gè)明明是錯(cuò)誤的東西,就這樣“順利”地通過了編譯。數(shù)組訪問越界在運(yùn)行時(shí),它的表現(xiàn)是不定的,有時(shí)似乎什么事也沒有,程序一直運(yùn)行(當(dāng)然,某些錯(cuò)誤結(jié)果已造成);有時(shí),則是程序一下子崩潰。因此在使用數(shù)組時(shí),一定要在編程中判斷是否越界以保證程序的正確性。
常見的錯(cuò)誤就是數(shù)組的size值和下標(biāo)訪問值弄錯(cuò),數(shù)組的下表是從0開始的,最大的訪問值是size-1。
3、解決辦法
由于數(shù)組的元素個(gè)數(shù)默認(rèn)情況下是不作為實(shí)參內(nèi)容傳入調(diào)用函數(shù)的,因此會(huì)帶來數(shù)組訪問越界的相關(guān)問題,解決問題方法,可以用傳遞數(shù)組元素個(gè)數(shù)的方法即:用兩個(gè)實(shí)參,一個(gè)是數(shù)組名,一個(gè)是數(shù)組的長度。
舉例:
#includestdio.h
void PutArray(int *p, int length)
{
// 在此判斷入口參數(shù)p和length的有效性
……
for(int
i=0;ilength;i++)
printf("%d\t",p[i]);
}
void main()
{
int a[3]={2,4,6} ;
printf("數(shù)組a[3]調(diào)用函數(shù)PutArray的結(jié)果為:\n");
PutArray(a,
sizeof(a)/sizeof(a[0]));
}
1、數(shù)組是多個(gè) 相同類型 的數(shù)據(jù)的組合,一個(gè)數(shù)組一旦聲明/定義了,其 長度是固定的,不能動(dòng)態(tài)變化 。
2、var arr []int? ? 這時(shí)arr就是一個(gè)slice 切片 。
3、數(shù)組中的元素可以是任何數(shù)據(jù)類型,包括值類型和引用類型,但是 不能混用 。
4、數(shù)組創(chuàng)建后,如果沒有賦值,有默認(rèn)值如下:
? ? 數(shù)值類型數(shù)組:????默認(rèn)值為 0
? ? 字符串?dāng)?shù)組:? ? ? ?默認(rèn)值為 ""
? ? bool數(shù)組:? ? ? ? ? ?默認(rèn)值為 false
5、使用數(shù)組的步驟:
? ? (1)聲明數(shù)組并開辟空間
? ? (3)給數(shù)組各個(gè)元素賦值
? ? (3)使用數(shù)組
6、數(shù)組的下標(biāo)是從0開始的。
7、數(shù)組下標(biāo)必須在指定范圍內(nèi)使用,否則報(bào)panic:數(shù)組越界,比如var arr [5]int的有效下標(biāo)為0~4.
8、Go的數(shù)組屬于 值類型 ,在默認(rèn)情況下是 值傳遞 ,因此會(huì)進(jìn)行值拷貝。 數(shù)組間不會(huì)相互影響。
9、如想在其他函數(shù)中去修改原來的數(shù)組,可以使用 引用傳遞 (指針方式)。
10、長度是數(shù)組類型的一部分,在傳遞函數(shù)參數(shù)時(shí),需要考慮數(shù)組的長度,看以下案例:
題1:編譯錯(cuò)誤,因?yàn)椴荒馨裑3]int類型傳遞給[]int類型,前者是數(shù)組,后者是切片;
題2:編譯錯(cuò)誤,因?yàn)椴荒馨裑3]int類型傳遞給[4]int類型;
題3:編譯正確,因?yàn)閇3]int類型傳給[3]int類型合法。