2015-04-22 58 views
-1

我想用2D矩陣進行計算。爲什麼這個崩潰沒有錯誤?C - 訪問2D數組槽功能不起作用,崩潰

代碼:

int main (void) 
{ 
    int myArray[2][3] = {{1,2,3},{5,4,3}}; 
    int height = 2; 
    int width = 3; 

    modifyArray((int**)myArray,height, width); 

} 

void modifyArray(int **array, int height1, int width1) 
{ 

    int result; 

    for(i=0;i<height1;i++) 
    { 
     for(j=0;j<width1;j++) 
     { 
      result = (**((array+i*3)+j)); 
      printf("%d", result) 
     } 
    } 
} 
+0

也請給你的錯誤/編譯消息:) – angabriel

+0

請發佈實際編譯的代碼! 'modifyArray()'應該做什麼?它不會修改數組。 –

+0

它不會給出任何錯誤。它只是崩潰。那麼它應該對var結果進行一些計算。而已。但它現在已經崩潰了,所以我認爲給一整塊沒有執行的純數學代碼是沒有用的。 – LandonZeKepitelOfGreytBritn

回答

0

由於該函數將傳遞的數組視爲int的一維數組,因此您的聲明可以簡化爲此。

#include <stdio.h>      // <<--- include 

void modifyArray(int *array, int height1, int width1) 
{ 
    int i, j, result;      // var declarations 
    for(i=0;i<height1;i++) 
    { 
     for(j=0;j<width1;j++) 
     { 
      result = *((array+i*3)+j); 
      printf("%d ", result);  // added ; 
     } 
    } 
} 

int main (void) 
{ 
    int myArray[2][3] = {{1,2,3},{5,4,3}}; 
    int height = 2; 
    int width = 3; 

    modifyArray(&myArray[0][0],height, width); 
    return 0; 
} 

程序輸出:

如果你想修改的陣列,即簡單地完成,例如

*((array+i*3)+j) = result; 
+0

謝謝你這個伎倆! – LandonZeKepitelOfGreytBritn

+0

確定只是接受它! – LandonZeKepitelOfGreytBritn

1

澆鑄到(int **)迫使myArray的被當作指針爲int的陣列。

這不是它是什麼 - 它是編譯器視爲二維數組的一塊內存。

+0

那我該怎麼糾正呢?因爲只需在函數myArray中打印整個數組就可以正常工作。它正在做的實際計算失敗... – LandonZeKepitelOfGreytBritn

0

2D陣列被編譯爲一個一維陣列 查看產生的組件是如何單個陣列通過做的reinterpret_cast(C樣式轉換)至(元件之間有4個字節增量)

int myArray[2][3] = {{1,2,3},{5,4,3}}; 
000000013F6510D4 mov   dword ptr [myArray],1 
000000013F6510DC mov   dword ptr [rsp+2Ch],2 
000000013F6510E4 mov   dword ptr [rsp+30h],3 
000000013F6510EC mov   dword ptr [rsp+34h],5 
000000013F6510F4 mov   dword ptr [rsp+38h],4 
000000013F6510FC mov   dword ptr [rsp+3Ch],3 

int ** - 正在訪問的內存佈局不兼容 - 因此導致訪問無效內存