- 論壇徽章:
- 2
|
回復 45# 變異老鼠
1下標在35樓就說了,它超出C的范圍了,而且都能設想出一種可能性。記得以前有過p[-1]的帖子,這里就不重復了。
但其他兩個(連續(xù)內(nèi)存、首成員地址)要說超出C范圍了吧,也許確實超了;但想不出會產(chǎn)生什么問題。
pmerofc 發(fā)表于 2012-05-11 23:21 ![]()
回復 35# OwnWaterloo
C99和C11都特意指出了這是一種未定義行為(附錄)
究竟是出于什么深刻的原因
我也不太明白
也許只是有罪推定呢? 制定標準時覺得這沒用 —— 都給我用flexible去…… —— 但又是確實他們的失誤呢?
為什么是失誤?將malloc得到的內(nèi)存當作二維又或是一維顯然必須是對的……
那么問題就來了,就是35樓與36樓的。這問題還可以反問44樓的cfaq:為什么malloc就可以,而自動變量就不行?
比如44樓的cfaq的代碼:
- f2(&array[0][0], NROWS, NCOLUMNS);
復制代碼 如果改為:
- void* p = malloc(NROWS * NCOLUMNS* sizeof(int));
- f2(p, NROWS, NCOLUMNS);
復制代碼 內(nèi)存大小相同 —— sizeof(array)==NROWS * NCOLUMNS* sizeof(int) —— ,對齊都合乎要求, 就完全沒問題。
為什么一個可以,另一個就不可以?
甚至依然用自動變量,但用一個union:
- union {
- int a1[N*M];
- int a2[N][M];
- } u;
復制代碼 又該怎么解釋?
能想到可能的回答是 —— 就像35樓說的 —— 編譯器進行一些邊界檢查。對a[N],超出[(char*)a,(char*)a+sizeof a)就報錯。
而對b[N][M],超出[(char*)b, (char*)b+sizeof b) 的訪問報錯我覺得可以做到。
但對中間的訪問,編譯器還能夠區(qū)分出是通過二維還是一維訪問,并且真的這么干了…… 那也管太寬了……
如果這編譯器還不提供命令行選項去掉這種功能,至少這編譯器我不會去用…… |
|