下面的代碼,根據我應該能夠成功運行,但在runtime.I失敗,沒有獲得的理由:運行時錯誤在下面的代碼
void main()
{
int arr[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int *m=arr[0];
int **p=&m;
p=p+1;
printf("%d",**p);
}
A.EXE已停止在GCC運行工作編譯器,窗口7 64位
下面的代碼,根據我應該能夠成功運行,但在runtime.I失敗,沒有獲得的理由:運行時錯誤在下面的代碼
void main()
{
int arr[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int *m=arr[0];
int **p=&m;
p=p+1;
printf("%d",**p);
}
A.EXE已停止在GCC運行工作編譯器,窗口7 64位
隨着線
int **p=&m
創建指針的指針爲整數。
然後,您向地址添加一個 - 一個內存地址,即不是指向下一個整數的字節數的一倍。
然後你尊重它兩次:
這裏int **p=&m;
。 p
指向m
。然後當p = p + 1;
p將指向m
(整數)旁邊的地址。該地址可能無法訪問。
int **p=&m;
p
點地址,其中m
放置:
... | m | sth | ... | p | ...
^ V
|_________________|
現在,增加它:
... | m | sth | ... | p | ...
^ V
|___________|
所以,現在p
點sth
。什麼是sth
?沒人知道。但你試圖訪問地址sth
包含。這是未定義的行爲。
一個數組的數組和一個指針的指針是完全不同的,不能互換使用。
例如,如果你看看你的陣列arr
它看起來像這樣在內存
+-----------+-----------+-----------+-----------+-----+-----------+ | arr[0][0] | arr[0][1] | arr[0][2] | arr[1][0] | ... | arr[4][2] | +-----------+-----------+-----------+-----------+-----+-----------+
當你有指針到指針p
節目真的不知道,它指向一個數組陣列,而不是把它視爲一個指針數組,它看起來像這樣的記憶:
+------+------+------+-----+ | p[0] | p[1] | p[2] | ... | +------+------+------+-----+ | | | | | v | | something | v | something v something
所以,當你做p + 1
你到p[1]
這顯然是不一樣的arr[1]
。
很好的答案,從ascii-flow **?** –
@GrijeshChauhan哈哈,不,用手仍然這樣做:) –
他還需要回答更好聲明和初始化2d矩陣的方法。我想是這樣。 –
您可能會喜歡閱讀:[double pointer and arrays](http://stackoverflow.com/questions/17752549/pointer-ptr-use/17752682#17752682) –
初始化二維數組不正確。 – AurA
你所忽略的所有警告怎麼樣? –