所以,我在另一个结构体中有一个结构......我想知道我如何才能使该结构变得糟糕......
#include <stdio.h>
#include <string.h>
struct
{
int n, o, p;
struct
{
int a, b, c;
}Str2;
}Str1;
main()
{
struct Str1.Str2 *x (Str1.Str2*)malloc(sizeof(struct Str1.Str2*));
x->a = 10;
}
所以,我尝试了,但是,不起作用。我怎么能做到这一点,还是更好地分配所有结构?
你只需要分配 Str1,Str2 就会被自动分配。在我的系统上,Str1 的大小是 24,等于 6 个整数的大小。试试这个:
typedef struct {
int n;
int o;
int p;
struct {
int a;
int b;
int c;
}Str2;
}Str1;
main()
{
Str1 *x = (Str1 *)malloc(sizeof(Str1));
x->Str2.a = 10;
printf("sizeof(Str1) %dn", (int)sizeof(Str1));
printf("value of a: %dn", x->Str2.a);
}
Str1
和Str2
是你声明的匿名struct
的对象,所以语法是错误的。你忘了一些类型定义吗?
//declares a single object Str1 of an anonymous struct
struct
{
}Str1;
//defines a new type - struct Str1Type
typedef struct
{
}Str1Type;
要命名一个struct
,您可以使用
struct Str1
{
...
};
现在,当您要引用此特定struct
时,可以使用struct Str1
。
如果只想将其用作Str1
,则需要使用 typedef
,例如
typedef struct tagStr1
{
...
} Str1;
或者typedef struct Str1 Str1;
如果我们有第一种类型的struct Str1
声明。
要创建没有名称的struct
实例(实例表示"该类型的变量"):
struct
{
...
} Instance;
由于此struct
没有名称,因此不能在其他任何地方使用,这通常不是您想要的。
在C(与C++相反)中,您不能在另一个结构的类型定义中定义一个新的类型结构,因此
typedef struct tagStr1
{
int a, b, c;
typedef struct tagStr2
{
int x, y, z;
} Str2;
} Str1;
不会编译。
如果我们将代码更改为:
typedef struct tagStr1
{
int a, b, c;
struct tagStr2
{
int x, y, z;
};
} Str1;
typedef struct tagStr2 Str2;
将编译 - 但至少 gcc 给出了"struct tagStr2 不声明任何内容"的警告(因为它希望您希望在 Str1
中实际拥有一个 struct tagStr2
类型的成员。
为什么不声明以下内容:
typedef struct
{
int a, b, c;
}Str2;
typedef struct
{
int n, o, p;
Str2 s2;
}Str1;
然后,您可以根据需要单独分配它们。 例如:
Str2 *str2 = (Str2*)malloc(sizeof(Str2));
Str1 *str1 = (Str1*)malloc(sizeof(Str1));
s1->s2.a = 0; // assign 0 to the a member of the inner Str2 of str1.