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)这是啥含义,求详细解释。