2013-07-23 33 views
0

下面的代碼,根據我應該能夠成功運行,但在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位

+0

您可能會喜歡閱讀:[double pointer and arrays](http://stackoverflow.com/questions/17752549/pointer-ptr-use/17752682#17752682) –

+3

初始化二維數組不正確。 – AurA

+2

你所忽略的所有警告怎麼樣? –

回答

4

隨着線

int **p=&m 

創建指針的指針爲整數。

然後,您向地址添加一個 - 一個內存地址,即不是指向下一個整數的字節數的一倍。

然後你尊重它兩次:

  • 兩個指針引用將返回未定值,所以第二個反引用可能會破壞內存邊界您正在使用的操作系統,
  • 兩次將被關閉邊界alignmemnt,這可能會在某些操作系統中導致問題。
0

這裏int **p=&m;p指向m。然後當p = p + 1; p將指向m(整數)旁邊的地址。該地址可能無法訪問。

2
int **p=&m; 

p點地址,其中m放置:

... | m | sth | ... | p | ... 
    ^    V 
     |_________________| 

現在,增加它:

... | m | sth | ... | p | ... 
      ^   V 
      |___________| 

所以,現在psth。什麼是sth?沒人知道。但你試圖訪問地址sth包含。這是未定義的行爲。

8

一個數組的數組和一個指針的指針是完全不同的,不能互換使用。

例如,如果你看看你的陣列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]

+0

很好的答案,從ascii-flow **?** –

+2

@GrijeshChauhan哈哈,不,用手仍然這樣做:) –

+0

他還需要回答更好聲明和初始化2d矩陣的方法。我想是這樣。 –