編譯環境:
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)
測試結構體聲明如下:
struct person
{
int age;
char name[256];
}
第一種: 先定義變量, 用[.]或者[->]引用的方式初始化
//棧空間
struct person p1;
p1.age = 20;
strcpy(p1.name, "xiaoming");
printf("age: %d\n", p1.age);
printf("name: %s\n", p1.name);
//堆空間
struct person * p2 = NULL;
p2 = (struct person *)malloc(sizeof(*p2))
if(p2 != NULL)
{
p2->age = 22;
strcpy(p2->name, "xiaohong");
printf("age: %d\n", p2->age);
printf("name: %s\n", p2->name);
free(p2);
p2 = NULL;
}
第二種: 顯示按順序在大括號中賦值初始化
/**棧空間**/
//定義的時候同時初始化, 必須注意順序
struct person p1 = {18, "xiaoming"};
printf("age: %d\n", p1.age);
printf("name: %s\n", p1.name);
//可先定義后初始化
struct person p2;
p2 = (struct person){19, "xiaohong"};
printf("age: %d\n", p2.age);
printf("name: %s\n", p2.name);
/**堆空間**/
//先申請好內存,后進行初始化
struct person * p3 = NULL;
p3 = (struct person *)malloc(sizeof(*p3));
if(p3 != NULL)
{
*p3 = (struct person){20, "xiaohua"};
printf("age: %d\n", p3->age);
printf("name: %s\n", p3->name);
free(p3);
p3 = NULL;
}
第三種: 在大括號中[.] + [成員]初始化方式, 這種方式linux內核常用與初始化順序無關;如果有重復的,最后一次初始化的值生效。(ps: 大括號中的最后一個逗號可加可不加)
/**棧空間**/
//定義的同時初始化
struct person p1 =
{
.age = 20,
.name = "xiaoming",
.age = 21,
};
printf("age: %d\n", p1.age);
printf("name: %s\n", p1.name);
//先定義再初始化
struct person p2;
p2 = (struct person)
{
.age = 21,
.name = "xiaohong",
};
printf("age: %d\n", p2.age);
printf("name: %s\n", p2.name);
/**堆空間**/
//先申請內存后初始化
struct person * p3 = NULL;
p3 = (struct person *)malloc(sizeof(*p3));
if(p3 != NULL)
{
*p3 = (struct person)
{
.age = 22,
.name = "xiaohua",
};
printf("age: %d\n", p3->age);
printf("name: %s\n", p3->name);
free(p3);
p3 = NULL;
}