2013-01-11 40 views
0

嗨我想了解指針和數組,並通過youtube上的視頻,我發現這個例子,我試圖自己重新創建。以下是代碼。將值分配給二維數組中的其他行在C

#include <stdio.h> 
#include <math.h> 
main() 
{ 
    int arr[][2]={{11,12},{21,22},{31,32},{41,42},{51,52}}; 
    int i,j; 
    arr[5][1]=61; 
    arr[5][0]=62; 
    arr[6][1]=71; 
    arr[6][0]=72; 
    arr[7][1]=81; 
    arr[7][0]=82; 
    for(i=0;i<=7;i++) 
    { 
     for(j=0;j<=1;j++) 
     { 
      printf("%d %d %u %u %d %d %d \n",i,j,arr[i],arr[i]+j,arr[i][j],*(*(arr+i)+j),*(arr[i]+j)); 
     } 
    } 
} 

當我執行的代碼它給我

 
0 0 3216856768 3216856768 11 11 11 
0 1 3216856768 3216856772 12 12 12 
1 0 3216856776 3216856776 21 21 21 
1 1 3216856776 3216856780 22 22 22 
2 0 3216856784 3216856784 31 31 31 
2 1 3216856784 3216856788 32 32 32 
3 0 3216856792 3216856792 41 41 41 
3 1 3216856792 3216856796 42 42 42 
4 0 3216856800 3216856800 51 51 51 
4 1 3216856800 3216856804 52 52 52 
5 0 3216856808 3216856808 0 0 0 
5 1 3216856808 3216856812 5 5 5 
6 0 3216856816 3216856816 72 72 72 
6 1 3216856816 3216856820 71 71 71 
7 0 3216856824 3216856824 82 82 82 
7 1 3216856824 3216856828 81 81 81 

爲什麼ARR [5] [0]和ARR [5] [1]不被分配給定的值? 5和0從哪裏來?

回答

3

C不是魔術(也不是腳本語言)。如果你創建一個有5個元素的數組,那麼它將有5個元素。不管你用它做什麼,它都不會自動擴展。之後,如果您從陣列外訪問陣列,則會導致未定義的行爲。這段代碼甚至可能會崩潰。

你應該做的,而不是要麼宣佈一個足夠大的數組:

int arr[8][2] = { { 11, 12 }, { 21, 22 }, { 31, 32 }, { 41, 42 }, { 51, 52 } }; 

後來的後來,你可以正確地分配給他們。或動態地使用利用標準存儲器管理功能malloc()realloc()擴大陣列:

int **arr = malloc(sizeof(*arr) * 5); 
int i; 
for (i = 0; i < 5; i++) { 
    arr[i] = malloc(sizeof(**arr)); 
} 

和填滿它一個接一個

arr[0][0] = 11; 
arr[0][1] = 12; 
// etc. 

然後將其展開時,它的neeed:

arr = realloc(arr, sizeof(*arr) * 8); 
for (i = 5; i < 8; i++) { 
    arr[i] = malloc(sizeof(**arr)); 
} 

在此之後,您也可以安全地使用arr[5]...arr[7]。然而,在後一種情況下,不要忘記所有在使用後需要釋放的指針。

+0

非常感謝。 – Anand

+0

因此,無論是在分配值之前定義較大的數組或分配內存。 – Anand

+0

@Anand是的,非常。 – 2013-01-12 14:08:39

相關問題