2d数组使用双指针和malloc函数

时间:2011-08-24 16:46:31

标签: c pointers

我正在尝试使用双指针创建一个二维数组... 我的代码是......


int **p1;
p1=(int **) malloc(2*sizeof(int *));
for(int i=0;i<2;i++)
{
    p1[i]=(int *) malloc(3*sizeof(int));
    for(int j=0;j<3;j++)
    {
       scanf("%d",(p1+i)+j);
    }

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

    for(int j=0;j<3;j++)
    {
       printf("%d\n",*(*(p1+i)+j));
    }

}

因为我为它声明了一个双指针(** p1),并且我能够使用我的扫描scanf("%d",(p1+i)+j);语句将数据放在所有这些位置。为了取消引用,我可以使用print语句,因为我已经完成printf("%d\n",*(*(p1+i)+j));

但是为什么它在print语句中断,但接受我的扫描声明。

但为什么这会给我正确的回应...

int mybox[][4]={{1,2,3,4},{5,6,7,8}};//we have to provide subscript;
for(int i=0;i<2;i++){
     for(int j=0;j<4;j++){
        printf("%d",mybox[i][j]);//will print all elements
        }
}
        printf("%d",*(*(mybox)+1));//give me 2
        printf("%d",*(*(mybox+1)+1));//give me 6
        printf("%d",*(*(mybox+1)+3));//give me 8

4 个答案:

答案 0 :(得分:4)

您的scanf部分未正确实施。它会破坏您的数据。具有讽刺意味的是,问题不会在scanf阶段出现,而是在printf阶段导致崩溃。

正确的scanf代码可能如下所示

for(int i=0;i<2;i++)
{
    p1[i]=(int *) malloc(3*sizeof(int));
    for(int j=0;j<3;j++)
    {
       scanf("%d",*(p1+i)+j);
    }
}

请注意额外的*。你真正需要的是

scanf("%d", &(*(*(p1 + i)) + j));

如果你愿意,你可以这样写。但是您可以注意到外部&“使用下一个嵌套*”湮灭“,因此上述内容相当于

scanf("%d", *(p1 + i) + j);

但是,我的建议是停止使用几乎不可读的*-and-+组合进行数组元素访问,并开始使用[]。这是您的代码应该从一开始就看起来的方式

...
scanf("%d", &p1[i][j]);
...
printf("%d\n", p1[i][j]);

除此之外,由于这是标记为C的标记,因此请尽量避免使用sizeof类型,并停止投射malloc的结果。

是一个更好的变体
int **p1;

p1 = malloc(2 * sizeof *p1);
for(int i = 0; i<2; i++)
{
  p1[i] = malloc(3 * sizeof *p1[i]);
  ...   

答案 1 :(得分:2)

scanf("%d",(p1+i)+j);

这是错误的,而不是你所期望的。关联性说a + b + c ==(a + b)+ c == a +(b + c)。

避免使用直接指针算法,因为当您不熟悉该语言时,它会让人感到困惑。喜欢:

   scanf("%d", &p1[i][j]);

   printf("%d\n", p1[i][j]);

生成的汇编代码与直接指针算法完全相同。

另外,不相关但很重要的是,不要强制转换类型的malloc(),因为这可能会隐藏代码中的潜在错误(比如缺少#include <stdlib.h>,这非常重要)。


请注意,int**int[][N]类型的实施方式完全不同。即使您可以使用相同的var[i][j]语法访问元素,但对其中一个假设不是正确的。

你的第二个例子给出了正确答案,因为它是......正确的?这就对了。第二个示例没有任何scanf(),这是第一个示例中的问题所在。

答案 2 :(得分:0)

这会创建一个2d数组,其中所有数据都存储在堆上的相邻内存单元中(与更常见的**语法相反)。它使用数组指针的概念,您可以在C lang FAQ中阅读。

int (*ptr)[X]; 
ptr = malloc(X * Y * sizeof(int));

是的,如果你以这种方式使用malloc,你可以使用ptr [x] [y]。

答案 3 :(得分:0)

scanf("%d\n",(*(p1+i)+j));

替换你的scanf以获取数组值......