学习笔记
《深入理解C指针》
http://www.ituring.com.cn/book/1147
第6章 指针与结构体
一、声明结构体
![](https://img.haomeiwen.com/i10191360/022234faba9c8bb5.png)
- 使用结构体的简单声明,要使用点表示法
/// 使用结构体的简单声明,要使用点表示法
Person person;
person.firstName = (char*)malloc(strlen("Emily")+1);
strcpy(person.firstName,"Emily");
person.age = 23;
printf("age: %d\n", person.age);
- 使用结构体指针,要用箭头操作符
/// 使用结构体指针,要用箭头操作符
Person *ptrPerson;
ptrPerson = (Person*)malloc(sizeof(Person));
ptrPerson->firstName = (char*)malloc(strlen("Emily")+1);
strcpy(ptrPerson->firstName,"Emily");
ptrPerson->age = 23;
printf("age: %d\n", ptrPerson->age);
- 还可以先解引指针然后用点操作符
Person *ptrPerson;
ptrPerson = (Person*)malloc(sizeof(Person));
(*ptrPerson).firstName = (char*)malloc(strlen("Emily")+1);
strcpy((*ptrPerson).firstName,"Emily");
(*ptrPerson).age = 23;
为结构体分配内存
-
short
是2个字节,结构体末尾自动填充了2个字节,使得整个结构体保持为16字节,16可以被4整除
为结构体分配内存
二、释放结构体
1、使用简单结构体声明
Person person;
initializePerson(&person, "Peter", "Underwood", "Manager", 36);
...
deallocatePerson(&person);
![](https://img.haomeiwen.com/i10191360/3cd7396c28f9ddb2.png)
图6-3:初始化的Person结构体
-
Person person;
本质就是一个函数局部变量,只不过这个变量是一个结构体变量,按照结构体定义中的规范(由 3个char*
1个int
) 组合起来的; -
结构体中有3个
char*
,都是使用malloc在函数内动态分配的内存,我们知道,不管你在哪里使用malloc,只要是使用的malloc,那就是在堆上分配内存给你; -
那么, 即便在函数执行结束后,局部变量person不复存在了, 但是那些通过
malloc
从堆上分配的内存还是存在的,因此需要通过deallocatePerson(&person);
来做到真真正正地释放;
2、指向person实例的指针
Person *ptrPerson;
ptrPerson = (Person*) malloc(sizeof(Person));
initializePerson(ptrPerson, "Peter", "Underwood", "Manager", 36);
...
deallocatePerson(ptrPerson);
free(ptrPerson);
![](https://img.haomeiwen.com/i10191360/431986eb2bc8af60.png)
图6-4:指向person实例的指针
-
当我们使用的是结构体指针时,首先,
Person *ptrPerson;
表示指针本身是属于函数的局部变量,其次,ptrPerson = (Person*) malloc(sizeof(Person));
这里明明白白的malloc
再次告诉我们,局部指针变量指向的内存还是从堆上分配的; -
那么, 在函数执行完毕前,我们不仅需要释放结构体里面使用到的内存们(由3个
char*
引起),用deallocatePerson(ptrPerson);
,而且还需要释放ptrPerson
指针指向的内存,用free(ptrPerson);
;
网友评论