通过C中的指针双数组

时间:2010-09-17 21:02:18

标签: c pointers multidimensional-array

我想借助指针扫描一个二维数组并编写这段代码,你能告诉我为什么编译器会出错吗?

#include<stdio.h>
#include<stdlib.h>
int main(void) {
    int i,j,n,a,b;
    int (*(*p)[])[];
    printf("\n\tEnter the size of the matrix in the form aXb\t\n");
    scanf("%dX%d",&a,&b);
    p=(int (*(*p)[b])[a])malloc(b*sizeof(int (*p)[a]));
    for(i=0;i<b;i++) {
            p[i]=(int (*p)[a])malloc(a*sizeof(int));
            printf("\t\bEnter Column %d\t\n");
            for(j=0;j<a;j++)
                    scanf("%d",&p[i][j]);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:2)

这是一种非常扭曲的语法。通常在制作2D数组时:

  • 声明只是int *p;
  • 分配只是p = malloc(a*b*sizeof(int));
  • 你不能写p[i][j]。您必须执行以下操作之一 - 创建包含行指针的辅助数组int **q以便能够编写q[i][j](更好的性能和易读性),或者编写p[b*i + j](更少的步骤)

另外,请注意:

  • 由于缺少%d参数,您的printf会喷出垃圾。
  • 由于C不是类型安全的,因此使用scanf将隐藏您可能发生的间接错误。

关于我能想到的最接近的东西,它类似于你想要做的事情:

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

int main()
{
    int i, j;

    const int a = 3, b = 4;
    int m[4][3];
    int (*p[4])[3];

    for (i = 0; i < b; i++)
    {
        p[i] = &m[i];
        printf("\t\bEnter Column %d\t\n", i);
        for (j = 0; j < a; j++)
        {
            int x;
            scanf("%d", &x);
            (*p[i])[j] = x;
        }
    }
    return 0;
}

它按预期编译和运行,但它毫无意义。 p是一个指向数组的指针数组。

答案 1 :(得分:2)

这句话有几个问题:

p=(int (*(*p)[b])[a])malloc(b*sizeof(int (*p)[a]));

首先,malloc返回void*。您正在使用(int (*(*p)[b])[a])来转换该指针,这会产生一个值,而不是数据类型。这不是一个有效的演员,所以这是编译器对你大吼大叫的一个原因。此时,p尚未初始化,因此如果执行此语句,此处发生的取消引用可能会导致程序崩溃。

malloc来电中,您正在使用sizeof(int (*p)[a])。语句int (*p)[a]不是有效的C语句。

似乎你正在使它变得更加复杂。有两种构建2D阵列的方法。 Reinderien解释说,您可以使用malloc(a * b * sizeof(int))构建数组。您还可以构建一个指针数组,每个指针指向一个类型为int的数组。从您的代码中,您似乎正在尝试执行后者。

更简单的方法是这样的:

int **p;
... get input from user ...
// Declare an array of int pointers of length b
p = malloc(b * sizeof(int*));

// For each int* in 'p' ...
for (i = 0; i < b; ++i) {
    // ... allocate an int array of length 'a' and store a pointer in 'p[i]' ..
    p[i] = malloc(a * sizeof(int));
    // ... and fill in that array using data from the user
    printf("\t\bEnter Column %d\t\n");
    for(j = 0; j < a; j++)
        scanf("%d", &p[i][j]);
}

使用这种构建2D数组的方法,您可以使用语法p[x][y]。由于p是指向指针的指针,p[x]是指向数组的指针,p[x][y]是指向数组中的项。