編譯環(huán)境:
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)
測(cè)試結(jié)構(gòu)體聲明如下:
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;
}
第二種: 顯示按順序在大括號(hào)中賦值初始化
/**棧空間**/
//定義的時(shí)候同時(shí)初始化, 必須注意順序
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);
/**堆空間**/
//先申請(qǐng)好內(nèi)存,后進(jìn)行初始化
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;
}
第三種: 在大括號(hào)中[.] + [成員]初始化方式, 這種方式linux內(nèi)核常用與初始化順序無關(guān);如果有重復(fù)的,最后一次初始化的值生效。(ps: 大括號(hào)中的最后一個(gè)逗號(hào)可加可不加)
/**棧空間**/
//定義的同時(shí)初始化
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);
/**堆空間**/
//先申請(qǐng)內(nèi)存后初始化
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;
}