2012-11-27 110 views
0

我正在使用一個指向intger的指針作爲2個Dims數組,我寫了這些代碼,但是我無法獲得整數值。指針指向整數

#include<stdio.h> 
#include<conio.h> 

void main(void) 
{ 
    int **pptr = 0, size = 0, size2 = 0, i, j; 

    clrscr(); 
    printf("Enter Size of Main Store n"); 
    scanf("%d", &size); 

    pptr = (int **) malloc(size * sizeof(int *)); 

    printf("Enter Size of Sub Store n"); 
    scanf("%d", &size2); 

    for (i = 0; i < size; i++) { 
     pptr[i] = (int *) malloc(size2 * sizeof(int)); 
    } 

    printf("Enter Values n"); 

    for (i = 0; i < size; i++) { 
     for (j = 0; j < size2; j++) { 
      scanf("%dn", pptr[i][j]); 
     } 
    } 

    clrscr(); 
    printf(" Valuesn"); 

    for (i = 0; i < size2; i++, pptr++) { 
     printf("%dn", *pptr + i); 
    } 

    getch(); 
} 

它打印垃圾!

+0

到底是什麼輸出? –

回答

2

scanf("%d", arg)需要一個指向int,但

for (i = 0; i < size; i++) { 
    for (j = 0; j < size2; j++) { 
     scanf("%dn", pptr[i][j]); 
    } 
} 

你傳遞一個int,在那一個未初始化的int。該內存位置中的不確定值然後被解釋爲指針,並且掃描嘗試存儲誰知道哪裏的轉換值。這不可能會導致分段錯誤。

您應該在那裏通過&pptr[i][j]作爲參數。

for (i = 0; i < size2; i++, pptr++) { 
    printf("%dn", *pptr + i); 
} 

打印int**pptr +i,這是&pptr[0][i],使用%d格式期望一個int參數。

你應該

printf("%d\n", pptr[0][i]); 
如果你要打印的對角線值(似乎是這樣,因爲你也是在循環增量 pptr),或

,更好

for(i = 0; i < size && i < size2; ++i) { 
    printf("%d\n", pptr[i][i]); 
} 

或者,如果你想打印整個電網,

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

是的,只是在做它,自上而下。 –

+0

我將它改爲&pptr [i] [j],但它仍然打印奇怪的值! –

+0

@Eslam是的,你的印刷循環也是錯誤的。我已經添加了一個修復程序,雖然我不確定你真的想在那裏打印什麼。 –

0

scanf函數需要int * ,而不是int。所以......

scanf("%dn", pptr[i][j]); 

應該是:

scanf("%dn", &(pptr[i][j])); 

,或者它可能是:

scanf("%dn", (pptr[i]+j)); 

也,printf的需要的值(int),而不是一個指針。所以......

printf("%dn", *pptr + i); 

也許應該是這樣的:

printf("%dn", *(*pptr+i)); 

或好得多尋找等價的:

printf("%dn", pptr[0][i]);