2014-01-10 44 views
0

我有這個程序。我無法理解發生了什麼。它打印一個額外的元素,我一定是一個轉儲人?不能爲什麼?請幫幫我!二維數組...打印額外的元素?

#include <stdio.h> 

int main(){ 
     int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1}; 
     int i = 0, j=0; 
     int *ptr = &n; 

     for(i=0; i<3; i++) 
      for(j=0; j<9; j++) 
     { 
      printf("%d\t",*((ptr+i)+j)) ; 
     } 
     system("pause"); 
     return 0; 
    } 
+1

我們可以看到你得到的輸出嗎? –

回答

3

這完全不是您如何訪問二維數組的元素。這裏有幾個錯誤。例如,您正在循環使用ij - 但由於您從08需要使用j,所以當您達到值i> 0時,您將遇到麻煩。你可以只是做

#include <stdio.h> 

int main(){ 

    int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1}; 

    int j=0; 
    int *ptr = &n[0][0]; 

    for(j=0; j<9; j++) 
    { 
    printf("%d\t",*(ptr+j)) ; 
    } 

    return 0; 
} 

這是一個有點簡單,但維護你的代碼的本質 - 因爲它是一個指針設置爲陣列的開始,增加此指針。一些變化:

#include <stdio.h> 

int main(){ 

    int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1}; 

    int j=0; 
    int *ptr = &n[0][0]; 

    for(j=0; j<9; j++) 
    { 
    printf("%d\t",*(ptr++)) ; 
    } 

    return 0; 
} 

#include <stdio.h> 

int main(){ 

    int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1}; 

    int i, j; 
    int *ptr = &n[0][0]; 

    for(i=0; i<9; i+=3) 
    { 
    for(j=0; j<3; j++) 
    { 
    printf("%d\t",*(ptr+i+j)) ; 
    } 
    } 

    return 0; 
} 

,當然還有老待機:

#include <stdio.h> 

int main(){ 

    int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1}; 

    int i, j; 

    for(i=0; i<3; i++) 
    { 
    for(j=0; j<3; j++) 
    { 
    printf("%d\t",n[i][j]); 
    } 
    } 

    return 0; 
} 

看看這些不同的方法對你纔有意義。如果他們不這樣問問題。

編輯一個簡單的修改你的程序表現出更好的東西在你原來代碼中的錯誤是:

#include <stdio.h> 

int main(){ 
    int i, j; 

    for(i=0; i<3; i++) 
    for(j=0; j<9; j++) 
    { 
     printf("i = %d; j = %d; i + j = %d\n", i, j, i+j); 
    } 
    return 0; 
} 

打印出在內環(你試圖的ij值依次打印數組元素)。你得到:

i = 0; j = 0; i + j = 0 
i = 0; j = 1; i + j = 1 
i = 0; j = 2; i + j = 2 
i = 0; j = 3; i + j = 3 
i = 0; j = 4; i + j = 4 
i = 0; j = 5; i + j = 5 
i = 0; j = 6; i + j = 6 
i = 0; j = 7; i + j = 7 
i = 0; j = 8; i + j = 8 
i = 1; j = 0; i + j = 1 
i = 1; j = 1; i + j = 2 
i = 1; j = 2; i + j = 3 
i = 1; j = 3; i + j = 4 
i = 1; j = 4; i + j = 5 
i = 1; j = 5; i + j = 6 
i = 1; j = 6; i + j = 7 
i = 1; j = 7; i + j = 8 
i = 1; j = 8; i + j = 9 
i = 2; j = 0; i + j = 2 
i = 2; j = 1; i + j = 3 
i = 2; j = 2; i + j = 4 
i = 2; j = 3; i + j = 5 
i = 2; j = 4; i + j = 6 
i = 2; j = 5; i + j = 7 
i = 2; j = 6; i + j = 8 
i = 2; j = 7; i + j = 9 
i = 2; j = 8; i + j = 10 

正如你所看到的,你幫我印了太多的元素,和你「脫落的邊緣」,因爲當i + j> 8,你正在訪問的內存超出其分配。這導致未定義的行爲。但它通常是一件壞事。

+0

弗洛里斯,真棒,你從根本上解釋它真的幫助任何初學者民間。謝謝 –

+0

@jayeshbhoi感謝您的反饋意見。 – Floris