如何分配struct的结构?

时间:2013-09-07 22:49:17

标签: c malloc

所以,我在其他结构中有一个结构..我想知道我怎么可以malloc那个结构...

#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;
}

所以,我尝试了,但是,不工作.. 我怎么能做到这一点,或者更好地分配所有结构?

4 个答案:

答案 0 :(得分:3)

您只需要分配Str1,并自动分配Str2。在我的系统上,Str1的sizeof是24,等于6 int的大小。试试这个:

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) %d\n", (int)sizeof(Str1));
     printf("value of a: %d\n", x->Str2.a);
}

答案 1 :(得分:1)

为什么不宣布以下内容:

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.

答案 2 :(得分:1)

Str1Str2是您声明的匿名struct的对象,因此语法很接近。你忘记了一些typedef吗?

//declares a single object Str1 of an anonymous struct
struct 
{
}Str1;

//defines a new type - struct Str1Type
typedef struct
{
}Str1Type;

答案 3 :(得分:1)

要命名struct,请使用

 struct Str1
 {
    ... 
 };

如果您想引用此特定struct Str1,现在可以使用struct

如果您只想将其用作Str1,则需要使用typedef,例如

typedef struct tagStr1
{
  ...
} Str1;

typedef struct Str1 Str1;如果我们有第一种类型的struct Str1声明。

创建一个没有名称的struct实例(实例意味着&#34;该类型的变量&#34;):

 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会发出警告&#34; struct tagStr2不会声明任何&#34; (因为它希望你想在struct tagStr2里面实际拥有Str1类型的成员。