直接上代码
/**
* 定义 Teacher结构体数据类型
* 本质 固定内存块大小的别名
*/
typedef struct Teacher{
int age;//4字节
char name[64];//64字节
float weight;//4字节
}Teacher;
/**
* 初始化Teacher
* @param tea Teacher指针变量地址
* @return 初始化结果
*/
int creatTeacher(Teacher **tea){
Teacher *tmp = NULL;
tmp = (Teacher *)malloc(sizeof(Teacher));//72字节
if (tmp == NULL) {
return -1;
}
*tea = tmp;
return 0;
}
/**
* 释放Teacher
* @param tea Teacher指针变量地址
* @return 释放结果
*/
int freeTeacher(Teacher **teaOne){
Teacher **tmp = teaOne;
if (tmp != NULL) {
free(*teaOne);
}
//这里值得注意的是,释放了内存后还要对Teacher指针变量置NULL,防止出现野指针
*tmp = NULL;
if (*tmp == NULL) {
return 0;
}else {
return -1;
}
}
void safeFree(void **objPtr){
if (objPtr != NULL && *objPtr != NULL) {
free(*objPtr);
*objPtr = NULL;
}
}
int main(int argc, const char * argv[]) {
Teacher *teaOne = NULL;
int result = creatTeacher(&teaOne);
if (result == -1) {
printf("func creatTeacher error:%d\n",result);
return result;
}else {
char tName[64] = "wangweihu";
teaOne->age = 26;
teaOne->weight = 75;
//给字符串数组赋值的两种方法
strcpy(teaOne->name,tName);
printf("老师的名字:%s, 体重:%fkg, 年龄:%d岁\n",teaOne->name, teaOne->weight, teaOne->age);
for (int i = 0; i<sizeof(tName); i++) {
teaOne->name[i] = tName[i];
}
printf("老师的名字:%s, 体重:%fkg, 年龄:%d岁\n",teaOne->name, teaOne->weight, teaOne->age);
int freeResult = freeTeacher(&teaOne);
if (freeResult == -1) {
printf("func freeTeacher error:%d\n",freeResult);
return freeResult;
}else {
return freeResult;
}
return result;
}
return 0;
}
解读:
1.结构体的定义
//定义
struct A {
int a; // 占4个字节
char b; // 占1个字节
short c; // 占2个字节
};
//定义并初始化
struct B {
int a; // 占4个字节
char b; // 占1个字节
short c; // 占2个字节
}B_demo = {10, 'w', 5};
2.结构体的初始化
3.结构体的释放
这里主要是安全释放,这里要做到对任何指针类型的试用,参数有必要改成void指针的指针,否则的话会报类型不匹配的警告。
void safeFree(void **objPtr){ if (objPtr != NULL && *objPtr != NULL) { free(*objPtr); *objPtr = NULL; }}
4.结构体实用用例
将指针传递给函数时,是值传递,函数里面拿到的也仅仅是一个拷贝指针,不会修改原指针的。如果我们想修改原指针而不是指针的副本,就需要传递指针的指针。
int creatTeacher(Teacher **tea){
Teacher *tmp = NULL;
tmp = (Teacher *)malloc(sizeof(Teacher));//72字节
if (tmp == NULL) {
return -1;
}
*tea = tmp;
return 0;
}
本例中传递的参数是结构体指针的内存地址,初始化完毕后,返回分配的指针;返回值是初始化结果。
网友评论