美文网首页
c语言结构体与二级指针结合之简单应用

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

作者: Scott丶Wang | 来源:发表于2016-07-15 10:22 被阅读450次

    直接上代码

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

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

    相关文章

      网友评论

          本文标题:c语言结构体与二级指针结合之简单应用

          本文链接:https://www.haomeiwen.com/subject/toryjttx.html