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();
}

它打印垃圾!

4

2 回答 2

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]%dint

你应该

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");
}
于 2012-11-27T03:57:43.363 回答
0

scanf 需要 a 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]);
于 2012-11-27T04:03:24.377 回答