c语言结构体与二级指针结合之简单应用

直接上代码

/**
 *  定义 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; iname[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;
}

本例中传递的参数是结构体指针的内存地址,初始化完毕后,返回分配的指针;返回值是初始化结果。

你可能感兴趣的:(c语言结构体与二级指针结合之简单应用)