美文网首页
[C指针]指针与结构体:(Person person; )VS

[C指针]指针与结构体:(Person person; )VS

作者: AkuRinbu | 来源:发表于2019-04-16 16:07 被阅读0次

    学习笔记

    《深入理解C指针》
    http://www.ituring.com.cn/book/1147
    第6章 指针与结构体

    一、声明结构体

    声明C 结构体
    • 使用结构体的简单声明,要使用点表示法
    /// 使用结构体的简单声明,要使用点表示法
        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;
    

    为结构体分配内存

    • short2个字节,结构体末尾自动填充了2个字节,使得整个结构体保持为16字节16可以被4整除
      为结构体分配内存

    二、释放结构体

    1、使用简单结构体声明

    Person person;
    initializePerson(&person, "Peter", "Underwood", "Manager", 36);
    ...
    deallocatePerson(&person);

    使用简单结构体声明
    图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);

    使用结构体指针
    图6-4:指向person实例的指针
    • 当我们使用的是结构体指针时,首先, Person *ptrPerson; 表示指针本身是属于函数的局部变量,其次, ptrPerson = (Person*) malloc(sizeof(Person));这里明明白白的malloc再次告诉我们,局部指针变量指向的内存还是从堆上分配的;

    • 那么, 在函数执行完毕前,我们不仅需要释放结构体里面使用到的内存们(由3个char*引起),用deallocatePerson(ptrPerson);,而且还需要释放ptrPerson指针指向的内存,用 free(ptrPerson);

    相关文章

      网友评论

          本文标题:[C指针]指针与结构体:(Person person; )VS

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