如何在C中使用另一个结构中的结构(同时使用malloc和2D数组?)

时间:2016-07-18 19:54:31

标签: c arrays struct malloc

我是使用struct的新手,希望你能帮助我。我想要一个嵌套的结构,使A的成员是B类结构。我到目前为止的代码如下所示。

typedef struct B
{
   int b1;
} b;

typedef struct A
{
    b a1;
}a;

但我也需要' a1'要成为一个动态的2d数组,所以我做了以下代码(不确定这是否正确,因为我使用了一个指向此指针的指针,以便在运行时设置'数组大小):

typedef struct B
{
   int b1;
} b;

typedef struct A
{
    b **a1;
}a;    

要存储我使用malloc的内存(不包括错误检测部分)。我需要引用并比较a1的每个成员x,如下所示(其中a和b是整数)。我可以这样做吗?:

a* one;
b** two;

one= malloc(10* sizeof(a*));
two= malloc(10* sizeof(b*));
for(x = 1; x <= 10; x++)
    {
        two[x] = malloc(10* sizeof(b));
    }

 if(one[x].two[a][b] == x)
    one[x].two[a][b].b1 =2;

很抱歉,如果我的代码根本没有意义。

2 个答案:

答案 0 :(得分:2)

  

我还需要&#39; a1&#39;成为一个二维数组,所以我做了以下代码(不是   确定这是否正确):

typedef struct B
{
   int b1;
} b;

typedef struct A
{
    b **a1;
}a;

代码提供有效的C声明,但看不到2d数组。 a1的成员struct A是指向struct B的指针,这完全不是同一个东西。如果你真的想要声明一个2d数组,那么你必须给它的边界,例如

typedef struct A {
    b a1[5][7];
} a;

但是,如果你不知道运行时所需的大小,那么双指针确实是你想要的 - 只是不要把它与2D数组混淆。

  

要存储我使用malloc的内存(不包括错误检测部分)。我需要引用并比较a1的每个成员x,如下所示(其中a和b是整数)。

嗯,ab不能是整数,因为您已经在同一范围内将它们用作类型名称。

  

我可以这样做吗?:

a* one;
b** two;

one= malloc(10* sizeof(a*));
two= malloc(10* sizeof(b*));
for(x = 1; x <= 10; x++)
    {
        two[x] = malloc(10* sizeof(b));
    }

除了已经提到的名称冲突之外,您对one的分配是错误的。它应该是......

 one = malloc(10 * sizeof(a));

......甚至更好......

 one = malloc(10 * sizeof(*one));

。您对twotwo[x]的分配是可以的,但如果以与上一个示例相同的方式重写它们会更好。

 if(one[x].two[a][b] == x)
    one[x].two[a][b].b1 =2;

one[x].two[i][j](对于整数ij)的类型为b,即struct Bx的类型为int。这些不具有可比性,所以不,您无法评估if条件下的表达式。但是one[x].two[a][b].b1的分配是可以的。

答案 1 :(得分:0)

不要乱用2D动态内存分配,而是伪造带有1D阵列的2D数组。

b *a1;
a1 = malloc(sizeof(b) * width * height);
for(i = 0; i < height; i++)
    for(j = 0; j < width; j++)
        do_stuff(a1[i*width + j];  //simulates a1[i][j]

唯一需要的是将宽度和高度值存储在某处,例如

typedef struct A {
    b *a1;
    int height;
    int width;
}