問題場(chǎng)景:
? 在我們編寫c語言程序時(shí),尤其是使用數(shù)組進(jìn)行編寫時(shí),通常會(huì)遇到一種令我們猝不及防的報(bào)錯(cuò):Run-Time Check Failure #2 - Stack around the variable ‘xxx‘ was corrupted,如圖:
?
問題描述
? 相信很多小伙伴遇到這個(gè)問題時(shí)都會(huì)和當(dāng)時(shí)的我一樣懵,奇葩的是這個(gè)程序明明可以成功運(yùn)行且結(jié)果無誤,但為什么在出結(jié)果的同時(shí)會(huì)彈出報(bào)錯(cuò)窗口呢?不要著急,我在這里可以為大家獻(xiàn)上我的錦薄之力,以下是我個(gè)人遇到的此類報(bào)錯(cuò)出現(xiàn)的原因、代碼場(chǎng)景以及解決辦法:
1.此類報(bào)錯(cuò)出現(xiàn)的原因通常是數(shù)組內(nèi)存越界
內(nèi)存越界我遇到過兩種情景:
(1)聲明數(shù)組時(shí)沒有規(guī)定數(shù)組元素個(gè)數(shù)的大小:
? 這里由于某些原因未能給大家呈現(xiàn)完整的代碼,但大家只需要知道圖中rev_intary函數(shù)的功能是將數(shù)組的所有元素倒序排列,而函數(shù)intary_rcpy是將一個(gè)數(shù)組的所有值賦給另一個(gè)數(shù)組對(duì)應(yīng)的元素,
在main函數(shù)中,我設(shè)了這樣兩個(gè)數(shù)組導(dǎo)致出現(xiàn)報(bào)錯(cuò):int m[]={5,6,8,9};int n[];
很明顯我這兩個(gè)數(shù)組都沒有標(biāo)明數(shù)組大小,但實(shí)際上問題是出在第二個(gè)數(shù)組上,因?yàn)閿?shù)組m在初始化為{5,6,8,9}時(shí),程序會(huì)根據(jù)我初始化的個(gè)數(shù)來自動(dòng)確定數(shù)組m的大小為4,我在main函數(shù)中應(yīng)用了函數(shù)intary_rcpy(m,n,4);這會(huì)使數(shù)組m的各個(gè)元素值儲(chǔ)存到數(shù)組n當(dāng)中,但由于數(shù)組n的大小我沒有給出聲明,導(dǎo)致棧溢出。
正確的做法只要給數(shù)組規(guī)定一個(gè)大小就行了:int [4];當(dāng)我這樣設(shè)出n時(shí),就不再出現(xiàn)報(bào)錯(cuò)了。
針對(duì)這類情景,總結(jié)如下
以下講解來自chatgpt:
當(dāng)你聲明一個(gè)數(shù)組時(shí),如果沒有指定數(shù)組的大小,編譯器無法知道需要為數(shù)組分配多少內(nèi)存空間。如果你在聲明數(shù)組后使用它,并且在使用過程中寫入超出數(shù)組分配的空間范圍的數(shù)據(jù),就會(huì)導(dǎo)致棧溢出。
在C/C++中,數(shù)組是在棧上分配的,它們的大小在編譯時(shí)確定。如果你聲明一個(gè)沒有指定大小的數(shù)組,編譯器無法為其分配足夠的內(nèi)存空間。因此,當(dāng)你嘗試向未分配足夠空間的數(shù)組中寫入數(shù)據(jù)時(shí),就會(huì)發(fā)生棧溢出錯(cuò)誤。
要解決這個(gè)問題,你需要在聲明數(shù)組時(shí)指定合適的大小,以確保分配足夠的內(nèi)存空間來存儲(chǔ)你要使用的數(shù)據(jù)。例如,可以聲明一個(gè)足夠大的數(shù)組來存儲(chǔ)密碼,并確保不要超出數(shù)組范圍進(jìn)行讀寫操作。另外,還可以考慮使用動(dòng)態(tài)內(nèi)存分配函數(shù)(如malloc()或new)來在堆上分配內(nèi)存。這樣,你可以根據(jù)需要?jiǎng)討B(tài)調(diào)整內(nèi)存大小,從而避免棧溢出問題。
————————————————
版權(quán)聲明:本文為CSDN博主「王三召」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_52918245/article/details/132117781
(2)數(shù)組下標(biāo)越界:
下面是一段此類錯(cuò)誤的代碼
? 乍一看沒有問題,實(shí)際上,我們仔細(xì)觀察,在for循環(huán)這里出現(xiàn)了問題,我們?cè)诼暶鲾?shù)組arr時(shí)明確了元素個(gè)數(shù)為5,因此arr的元素下標(biāo)應(yīng)該是從0-4,但在for循環(huán)中,我們居然讓i增加到了5,也就是說,我在最后訪問了arr[5],這就導(dǎo)致我越界了,因?yàn)?span style="color:#ff9900;">arr數(shù)組只開辟了5個(gè)整型數(shù)據(jù)元素的空間,即arr數(shù)組的可訪問元素下標(biāo)范圍在0-4之間,for循環(huán)的最后一次循環(huán)明顯越界訪問了下標(biāo)為5的元素(即第6個(gè)元素).
因此會(huì)導(dǎo)致編譯器報(bào)錯(cuò)"Run-Time Check Failure #2 - Stack around the variable 'arr2' was corrupted."
2.編譯器本身問題
剛才說過,此類報(bào)錯(cuò)的原因通常是內(nèi)存越界,但也有例外,我最近就碰到了這個(gè)例外。
這里我所設(shè)的函數(shù)都是關(guān)于動(dòng)態(tài)二維數(shù)組的,main函數(shù)里我的二維數(shù)組也都明確了數(shù)組大小,我左看右看也沒看出哪里出現(xiàn)了越界,于是我就到網(wǎng)上搜尋網(wǎng)友們的方案,找到了兩種可行的解決方法:
?1).把“project->配置屬性->c/c++->代碼生成->基本運(yùn)行時(shí)檢查 設(shè)置為默認(rèn)值。? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 2).創(chuàng)建數(shù)組的方式改用new或者malloc,改為正常運(yùn)行
3.總結(jié):
發(fā)生此報(bào)錯(cuò)一般有兩種情況:
? ? ? ? 第一 -> 數(shù)組下標(biāo)越界。這也是最常見的問題原因,解決辦法是檢查數(shù)組是否有越界情況,如果有的話創(chuàng)建一個(gè)更大的數(shù)組
? ? ? ? 第二->聲明時(shí)未規(guī)定數(shù)組大小。文章來源:http://www.zghlxwxcb.cn/news/detail-760192.html
? ? ? ?第三->編譯器本身的問題。(在前兩種情況不適用時(shí)考慮編譯器問題。)文章來源地址http://www.zghlxwxcb.cn/news/detail-760192.html
到了這里,關(guān)于【關(guān)于[C]報(bào)錯(cuò):Run-Time Check Failure #2 - Stack around the variable ‘xxx‘ was corrupted的示例及解決辦法】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!