如何在c中使用双指针访问数组元素

时间:2013-02-16 00:53:57

标签: c matrix

它在屏幕上显示最后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;
}

2 个答案:

答案 0 :(得分:0)

&fool[i][j].x中的scanffool[i][j].x中的printf应该是{{1}}。

答案 1 :(得分:0)

这是因为你没有读到fool的第二个“行”。 scanf("%d", &(*fool)[j].x);解除引用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]