[問題] 超過陣列範圍仍然有值

看板C_and_CPP作者 (qq)時間12年前 (2013/04/26 21:34), 編輯推噓2(2010)
留言12則, 5人參與, 最新討論串1/1
/ ==================================== int main() { char *a[4]={"一一","二二","三三","四四"}; char *ptr; for(int i=0;i<4;i++) { printf("a[%d]=",i); ptr=a[i]; for(int j=0;*(ptr+j)!='\0';j++) printf("%c",*(ptr+j)); printf("\n"); } cout<<a[4];-----------------> system("pause"); return 0; } 小弟在練習用指標顯示字串,但是發現cout<<a[4];他會顯示"四四"這個字串 a這個字元指標陣列他的索引值,最大應該是a[3] 為什麼我給他a[4]他仍會顯示"四四"這個字串 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.235.185.244

04/26 21:41, , 1F
因為記憶體排列順序的關係a[4]會跟ptr一樣
04/26 21:41, 1F

04/26 21:42, , 2F
不過實際上應該是「發生任何事都不意外」
04/26 21:42, 2F

04/26 21:44, , 3F
建議你把記憶體位置print出來 觀察看看
04/26 21:44, 3F

04/26 21:56, , 4F
第二戒
04/26 21:56, 4F

04/26 22:15, , 5F
cout<<&ptr<<endl;cout<<&a[3]<<endl;cout<<&a[4]<<endl;
04/26 22:15, 5F

04/26 22:16, , 6F
剛看了發現ptr沒有指向a[3]或a[4] 為什麼?
04/26 22:16, 6F

04/26 22:18, , 7F
0x28fef4,0x28ff04,0x28ff08 分別是指向這3個位置
04/26 22:18, 7F

04/27 01:36, , 8F
你本來就不該讀取超出範圍的陣列
04/27 01:36, 8F

04/27 15:46, , 9F
謝謝樓上 只是覺得a[4]超出範圍 應該顯示的是亂碼之類的
04/27 15:46, 9F

04/27 15:47, , 10F
不了解為啥顯示的是最後一筆的資料
04/27 15:47, 10F

04/27 17:53, , 11F
未定義行為, 想知道的話只能去看組語了
04/27 17:53, 11F

04/27 17:55, , 12F
不過看起來是, a[4] 剛好存取到 ptr
04/27 17:55, 12F
文章代碼(AID): #1HUe9eED (C_and_CPP)