指向整数的指针

时间:2012-11-27 03:53:13

标签: c pointers

我正在使用指向整数的指针作为2 Dim数组,我写了这些代码但是我没有获得整数值。

#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();
}
它打印垃圾!!

2 个答案:

答案 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。然后,该内存位置中的不确定值被解释为指针,并且扫描会尝试存储转换后的值who-knows-where。这不会导致分段错误。

你应该在那里传递&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");
}

答案 1 :(得分: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]);