我是使用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;
很抱歉,如果我的代码根本没有意义。
答案 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是整数)。
嗯,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)); }
除了已经提到的名称冲突之外,您对one
的分配是错误的。它应该是......
one = malloc(10 * sizeof(a));
......甚至更好......
one = malloc(10 * sizeof(*one));
。您对two
和two[x]
的分配是可以的,但如果以与上一个示例相同的方式重写它们会更好。
if(one[x].two[a][b] == x) one[x].two[a][b].b1 =2;
one[x].two[i][j]
(对于整数i
和j
)的类型为b
,即struct B
。 x
的类型为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;
}