2

它在屏幕上显示最后 2 个数字和其他 2 个奇怪的数字。如何打印所有元素?我试图将双指针**傻瓜的开头保留在另一个指针**st中。但它似乎不起作用。

#include<stdio.h>
#include<stdlib.h>

typedef struct a {
    int x;

}A_t;

typedef struct b {

    A_t **y;

}B_t;

int main() {


    int i, j;

    A_t **fool, **st;

    fool = (A_t**)malloc(2 * sizeof(A_t*));
    st = fool;

    for(i = 0; i < 2; i++) {

        fool[i] = (A_t*)malloc(2 * sizeof(A_t));

        for(j = 0; j < 2; j++) {
            printf("NR: ");
            scanf("%d", &(*fool)[j].x);
        }

    }

    fool = st;
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 2; j++) {
            printf("%d ", (*fool + i)[j].x);
        }
    }

    return 0;
}
4

2 回答 2

0

这是因为您没有读入fool. scanf("%d", &(*fool)[j].x);dereferences fool,您可以建模为fool[0],然后访问第 j 个元素(所以fool[0][j]。当然,因为您从不更改第一个索引,所以读取的最后两个值将占据fool[0][0]fool[0][1]。然后您将获得其他两个的随机值简单因为读取一个未初始化的变量是一个未定义的操作。实际上,您倾向于在应用程序之前获取驻留在该内存区域中的任何内容。

相反,您可以使用您在printf(例如scanf("%d", &(*fool+i)[j].x))中使用的语法,或者,正如我在上面键入此内容时 KerrekSB 刚刚在上面发布的那样,使用标准的数组访问操作来代替。

详细说明,fool[i][j]相当于(*fool+i)[j].

于 2013-02-16T00:58:46.803 回答
0

它应该&fool[i][j].xscanffool[i][j].xprintf

于 2013-02-16T00:57:17.763 回答