0

所以,我在其他结构中有一个结构..我想知道如何分配该结构...

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

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

4

4 回答 4

3

您只需要分配 Str1 和 Str2 将自动分配。在我的系统上,Str1 的 sizeof 是 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) %d\n", (int)sizeof(Str1));
     printf("value of a: %d\n", x->Str2.a);
}
于 2013-09-07T22:57:53.533 回答
1

要命名 a struct,请使用

 struct Str1
 {
    ... 
 };

您现在可以struct Str1在要引用此特定struct.

如果你只想使用它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 不声明任何内容”的警告(因为它希望您实际上想要在struct tagStr2内部拥有一个类型的成员Str1

于 2013-09-07T23:06:53.803 回答
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.
于 2013-09-07T22:51:32.110 回答
1

Str1并且Str2是您声明的匿名structs 的对象,因此语法很差。你忘记了一些类型定义吗?

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

//defines a new type - struct Str1Type
typedef struct
{
}Str1Type;
于 2013-09-07T22:51:41.080 回答