结构体(二)
结构体的初始化:
#if 0 // 结构体的初始化// 初始化一个结构体变量
// 虽然正常,但是通常我们不这样用
struct Node
{int x;float y;char z;
}n={123, 456, 'z'}, n1={111, 222, 'h'};int main(int argc,char *argv[])
{// struct Node 是类型// n 是结构体变量struct Node n;printf("%d, %f, %c\n", n.x, n.y, n.z);printf("%d, %f, %c\n", n1.x, n1.y, n1.z);return 0;
}
#endif
// 常规用法
typedef struct Person // 如果使用了typedef, Person可以省略不写
{
char name[255];
int age;
}PERSON; // 有typedef时,PERSON是类型名; 没有typedef时,PERSON是变量名。
int main()
{
// 两种常用的结构体变量声明方式
struct Person per1;
PERSON per;
// struct p1; // error
// Person p2; // 在C语言中也是error
// per.name = "ssss"; // error: 因为name是数组名,不可以这样操作
strcpy(per.name, "ssss"); // 如果结构体成员是字符数组,就只能使用strcpy来赋值
per.age = 18;
printf("name = %s, age = %d\n", per.name, per.age);
return 0;
}
#if 0typedef struct
{int* ptr;char* name;
}NODE;int main()
{NODE n;// 如果结构体中的成员是指针类型,通常在使用时需要先动态开辟内存n.ptr = (int*)malloc(sizeof(int) * 10); if (n.ptr == NULL){perror("n.ptr malloc fail");return -1;}n.name = (char*)malloc(sizeof(char) * 100); if (n.name == NULL){perror("n.name malloc fail");return -1;}strcpy(n.name, "yuanhoufeng");for (int i = 0; i < 10; i++){*(n.ptr+i) = i + 100;}printf("%s\n", n.name);for (int i = 0; i < 10; i++){printf("%d ", *(n.ptr+i));}printf("\n");if (n.ptr != NULL){free(n.ptr);n.ptr = NULL;}if (n.name != NULL){free(n.name);n.name = NULL;}return 0;
}#endif
#if 0
typedef struct
{
char* name;
}NODE;
int main()
{
// 如果定义了一个结构体指针变量,那么通常我们也是先动态开辟内存
NODE* n = NULL;
// 这段代码是让结构体的指针变量有了有效内存指向,与结构体成员变量没有关系
n = (NODE*)malloc(sizeof(NODE));
if (n == NULL)
{
perror("n malloc fail");
return -1;
}
// 给指针类型的成员变量开辟内存
n->name = (char*)malloc(sizeof(char)*100);
if (n->name == NULL)
{
if (n != NULL)
{
free(n);
n = NULL;
}
perror("n->name malloc fail");
return -1;
}
strcpy(n->name, "hahaha");
printf("%s\n", n->name);
// 最后释放内存时,切记:需要先释放成员的堆内存,最后释放结构体的内存
if (n->name != NULL)
{
free(n->name);
n->name = NULL;
}
if (n != NULL)
{
free(n);
n = NULL;
}
return 0;
}
#endif