二維陣列轉指標時可能會遇到的問題

2021-07-03 12:56:48 字數 1079 閱讀 6069

關於

int t[2][2] = ;

int ** p = (int**)t;

這種寫法,執行過後,會出現  

p[0]=1;

p[1]=2;

p[2]=3;

p[3]=5;

這種情況。也許有朋友會不理解。肯定很多初學者會認為 p[0][0]=1 而不是 p[0] =1;  其實不然,此時如果呼叫 p[0][0] 將會出錯。因為 p[0]=0;然後 p[0][0] 相當於取 *(0) ,這當然是錯誤的。那為什麼會出現上面的情況,其實 t 是乙個二維陣列,而 p 則是個二級指標(它們之間在某種程度上來說,差別很大,並不能同日而語,二維陣列實質是一維陣列,是一塊連續的空間,而二維指標則不一定了),  p[0] ,p[1], p[2] ,p[3] 裡面存放的都是乙個指向一維指標的位址。檢視 p 現在的記憶體可以看到:

p[0]相當於 *(p+0); p[1] 相當於 *(p+1) ,由於 p 是二級指標,也就是它的變數(指標)佔 4 位元組 ,按 p 往後推算 4 位元組就到了 p+1 指向的位址,此時正好是 2 。 

其實這裡完全是因為巧合:int 型別佔 4 位元組,指標型別也是 4 位元組。所以造成了一種假象:t 裡面的每個數字被存放在了 p[n] (0其實看 p[0] 指向的記憶體可以看出來:

如果我們換成 char (乙個位元組) 型別,就不會出現這種假象了,因為 char 只有乙個位元組,此時會將四個 char 同時存入乙個 p[0] ,不會是分開存放了。

char t[2][2]= ;

char ** p = (char**)t;

檢視記憶體:然而我們看 p[0] 則會發現 p[0]指向的位址是

紅圈裡面的值正是 t 裡面四個 char 的值,按照本機大小端方案排列,即 '1','2','3','5' 的 ascii 碼。此時 p[1] 呢? p[1]當然就是取 t 後面的 4 個未知的位元組作為它的值了。。

char 轉string可能會遇到的問題

char 型別的字串或者二進位制資料,在傳遞引數給string模板型別時,如果char 裡面含有 00 即c c 字串預設結尾的 0 時,會發生截斷,導致莫名其妙的問題發生。所以在傳遞char 型別的資料時,接受者也是char 如果唯讀的話,那麼就是const char 另外不同模組間呼叫函式時,返...

char 轉string可能會遇到的問題

char 型別的字串或者二進位制資料,在傳遞引數給string模板型別時,如果char 裡面含有 00 即c c 字串預設結尾的 0 時,會發生截斷,導致莫名其妙的問題發生。所以在傳遞char 型別的資料時,接受者也是char 如果唯讀的話,那麼就是const char 另外不同模組間呼叫函式時,返...

MVC專案初次發布到IIS可能會遇到的問題

mvc4 net framework 4.5 windows server 2008 iis7.5 4.0整合模式池 初次發布後可能會遇到404.0 或者403.14錯誤,加入以下 可以解決此問題。configuration system.webserver modules runallmanage...