Linux C/C++关于结构体定义,typedef关键字的使用场景

Posted Michael_Good

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux C/C++关于结构体定义,typedef关键字的使用场景相关的知识,希望对你有一定的参考价值。

typedef关键字修饰结构体声明的优劣

优势:
在C语言中,可以使用两种方式来定义结构体类型:使用struct关键字和使用typedef关键字。使用struct关键字定义结构体类型时,需要在定义时同时指定结构体的名称和成员变量,例如:

struct Person 
    char name[20];
    int age;
;

使用typedef关键字定义结构体类型时,可以将结构体类型重命名为一个新的类型名,例如:

typedef struct 
    char name[20];
    int age;
 Person;

这样,就可以直接使用Person作为结构体类型名,而不需要再使用struct关键字。但是,如果只是使用typedef关键字定义结构体类型,而没有指定结构体的名称,那么这个结构体类型就无法被直接使用,例如:

typedef struct 
    char name[20];
    int age;
 ;

这个结构体类型没有名称,无法被直接使用,因此在定义命名结构体时,需要同时使用struct关键字和typedef关键字,例如:

typedef struct Person 
    char name[20];
    int age;
 Person;

这样就可以定义一个命名为Person的结构体类型,并且可以直接使用Person作为结构体类型名。因此,在C语言中,命名结构体通常使用struct和typedef关键字的组合来定义。
缺点:

不使用typedef定义结构体类型的好处是可以更加清晰地表达代码的含义,避免类型混淆和歧义。当我们在代码中使用结构体类型时,如果没有使用typedef关键字,那么我们需要在每次使用结构体类型时都要加上struct关键字,例如:

struct Person 
    char name[20];
    int age;
;

int main() 
    struct Person p1;
    // ...
    return 0;

这样虽然有些繁琐,但是可以更加明确地表达p1是一个结构体类型的变量。如果我们使用了typedef关键字,那么可以直接使用新的类型名来代替结构体类型名,例如:

typedef struct 
    char name[20];
    int age;
 Person;

int main() 
    Person p1;
    // ...
    return 0;

这样虽然更加简洁,但是可能会导致类型混淆和歧义。如果我们在代码中定义了多个类似的结构体类型,使用不同的typedef名称来代替结构体类型名,那么可能会导致代码的可读性和可维护性降低。因此,在一些需要更加清晰地表达代码含义的场景下,不使用typedef定义结构体类型可能更加合适。

当我们在代码中定义了多个类似的结构体类型,并且使用了不同的typedef名称来代替结构体类型名时,容易导致类型混淆和歧义。例如:

typedef struct 
    char name[20];
    int age;
 Person;

typedef struct 
    char name[20];
    char address[50];
 Employee;

int main() 
    Person p1;
    Employee e1;
    // ...
    return 0;

在这个例子中,我们定义了两个类似的结构体类型Person和Employee,并且使用了不同的typedef名称来代替结构体类型名。虽然这样可以让代码更加简洁,但是也容易导致类型混淆和歧义。例如,如果我们在代码中使用了一个变量p1,那么很难确定它是Person类型的变量还是Employee类型的变量。因此,在这种情况下,不使用typedef定义结构体类型可能更加合适,可以让代码更加清晰易懂。

关于定义结构体指针数组

    typedef int score;
    typedef struct tnode *ptrtonode;
    typedef ptrtonode tree; 
    struct tnode{
         score s;
         tree next;
         bool know;
    }; 

    scanf("%d",&n);
    tree t[n];

    for(i=0;i<n;i++){
        scanf("%d",&x);
        t[i]->s=x;
      t[i]->next=NULL;
      t[i]->know=false;
  }

此声明仅保留内存空间。由于n没有在编译时定义,数组的内容包含垃圾值。

  tree t[n];

任何访问都t[i]将导致程序访问内存位置,用存在于其中的值表示t[i],很可能是无效内存位置的地址。这会导致你的崩溃。在其他情况下,它可能会导致程序无关部分的内存损坏,并产生不正确的结果或再次崩溃。

需要在分配节点之前初始化数组元素。

for(i=0;i<n;i++){
    scanf("%d",&x);
    t[i] = (struct tnode *)malloc(sizeof(tnode)); // this was missing.
    t[i]->s=x;
    t[i]->next=NULL;
    t[i]->know=false;
}
 

以上是关于Linux C/C++关于结构体定义,typedef关键字的使用场景的主要内容,如果未能解决你的问题,请参考以下文章

结构体指针

c/c++如何正确使用结构体?

c语言 结构体变量的首地址是啥??作用是?

关于重叠IO(overlapped)模型中完成例程使用的两点疑问

关于结构体占用空间大小总结

“->"这个符号代表啥含义,比如linux内核链表里的(ptr)->next = (ptr)这是啥含义,求详细解释。