鍍金池/ 問答/Python  C++/ c++數(shù)組越界不報(bào)錯(cuò),是因?yàn)閷?shù)組當(dāng)指針處理嗎?

c++數(shù)組越界不報(bào)錯(cuò),是因?yàn)閷?shù)組當(dāng)指針處理嗎?

int array[ 3 ] = { 1, 2, 3 } ;
std::cout << array[3] << std::endl;
std::cout << array[4] << std::endl;
std::cout << array[100] << std::endl;
上面的代碼輸出為
0
-858993460
-858993460
0
-858993460
沒有報(bào)錯(cuò)是因?yàn)橹苯訉?array[3]當(dāng)做*(array+3)處理嗎?
那為什么array[3],array[4]輸出結(jié)果相同?

回答
編輯回答
墨沫

沒有報(bào)錯(cuò)是因?yàn)橹苯訉?code>array[3]當(dāng)做*(array+3)處理嗎?

可以這么理解。以C++的尿性來看,這樣最簡單,最快,也方便各種魔幻用法。檢測越界這種事應(yīng)該交給庫,或者更高級的語言。

那為什么array[3],array[4]輸出結(jié)果相同?

Visual C++ 編譯器會在調(diào)試模式下把未初始化的內(nèi)存用0xCC填充。如果輸出字符串,就是喜聞樂見的燙燙燙。如果輸出int32,就是-858993460。

[...new Uint8Array(Int32Array.of(-858993460).buffer)].map(e => e.toString(16))
// <- ["cc", "cc", "cc", "cc"]

也可以搜索“補(bǔ)碼在線計(jì)算器”自己驗(yàn)證。

2018年1月29日 11:33
編輯回答
傻丟丟

個(gè)人看法:

編譯器不檢測越界錯(cuò)誤,
只有運(yùn)行時(shí)候訪問到了系統(tǒng)的違法地址,系統(tǒng)會拋給程序錯(cuò)誤,程序繼續(xù)上推

2017年11月16日 09:20