美文网首页
结构体内存分析以及指向结构体的指针

结构体内存分析以及指向结构体的指针

作者: SimpleSJ | 来源:发表于2018-10-31 10:48 被阅读0次

1.结构体内存分析

  • 1.结构体存储原理
    • 内存是以字节为单位编号,但一些硬件平台对某些特定类型的数据只能从某些特定地址开始, 比如从偶地址开始。若不按照适合其平台的要求对数据存放进行对齐,会影响到效率。 因此,在内存中,各类型的数据是按照一定的规则在内存中存放的,这就是对齐问题。
    • 结构体占用的内存空间是每个成员占用的字节数之和(考虑对齐问题)
  • 2.结构体变量占用存储空间大小

注:定义结构体类型不分配存储空间,定义变量时才分配存储空间

  • 规则一:找到结构体中占用字节数最大的类型,假设其占用的字节数为8,每次开辟新的存储空间都增加8.
  • 规则二:结构体中每条数据按定义类型时的顺序存储,一条数据能存的下就往里存,存不下就开辟新的内存空间
🌰:
#include <stdio.h>
int main(int argc, const char * argv[]) {
//定义结构体类型,这里的结构体类型Person中,占用字节数最大的数据类型为double(64位编译器下占用8个字节),在存储score、height、age时,存储空间不够的情况下,每次都会新开辟8个字节.
/*
struct Person {
        short score;
        int age;
        double height;
    };
//定义结构体变量
    struct Person sp = {99,18,178.0};
    printf("调整顺序前------%lu\n",sizeof(sp));
*/
//调整结构体类型数据的顺序
struct Person {
        short score;
        double height;
        int age;
    };
   struct Person sp = {99,178.0,18};
    printf("调整顺序后------%lu\n",sizeof(sp));
    return 0;
}
//输出:
调整顺序前------16
调整顺序后------24

存储空间大小不同的原因与结构体数据的顺序有关,例子中,最关键的是第二个数据的存储,调整前第二个数据为int类型,由于变量存储时一次开辟sizeof(double) = 8;short占用了其中的两个字节,剩余的6个字节能够存储int的4个字节,所以不会开辟新的存储空间,而调整后第二个数据为double,剩余的6个字节不够存储double,所以开辟了新的存储空间8个字节.所以调整前存储一个结构体变量需要16个字节,而调整后需要24个字节

2.指向结构体变量的指针

      // 定义一个结构体类型
      struct Student {
          char *name;
          int age;
      };

     // 定义一个结构体变量
     struct Student stu = {“sj", 25};

     // 定义一个指向结构体的指针变量
     struct Student *p;

    // 指向结构体变量stu
    p = &stu;

     /*
      这时候可以用3种方式访问结构体的成员
      */
     // 方式1:结构体变量名.成员名
     printf("name=%s, age = %d \n", stu.name, stu.age);

     // 方式2:(*指针变量名).成员名
     printf("name=%s, age = %d \n", (*p).name, (*p).age);

     // 方式3:指针变量名->成员名
     printf("name=%s, age = %d \n", p->name, p->age);

     return 0; 
}

相关文章

  • 【C语言笔记】<十九>结构体

    结构体的基本概念 结构体初始化 结构体的内存存储细节 结构体定义的方式 结构体类型的作用域 指向结构体的指针 结构...

  • 结构体内存分析以及指向结构体的指针

    1.结构体内存分析 1.结构体存储原理内存是以字节为单位编号,但一些硬件平台对某些特定类型的数据只能从某些特定地址...

  • C语言-5、结构体

    写法一 写法二 写法三 结构体指针 结构体指针 与 动态内存开辟 结构体的数组 结构体与结构体指针 取别名 取别名...

  • 结构体

    一.结构体赋值问题 如果结构体内部有指针指向内存,那么结构体p1=结构体p2会造成两个问题1.该指针可能会被重复释...

  • 结构体与结构体指针数组

    1.结构体定义与使用。 2.结构体指针 与 动态内存开辟。 3.结构体的数组。 4.结构体与结构体指针 取别名。 ...

  • 结构体操作

    1.动态创建一个结构体,里面有指针,为指针对象创建内存 结构体定义 释放结构体

  • C语言里的顺序链表如何实现

    分析: 定义几个结构体,每个结构体里面包含俩个成员,一个整型变量,一个指针变量。让一个结构体里的指针变量指向另一个...

  • OC底层原理06 - 类结构探索(1)

    类是什么? 类:指向objc_class结构体的指针 对象:指向objc_object结构体的指针 从上面源码中可...

  • 42_内存操作经典问题分析二

    1. 常见内存错误 (1) 结构体成员指针未初始化——野指针(2)结构体成员指针未分配足够的内存——越界(3)内存...

  • ndk-基础知识

    数组和指针,数组指针,指针数组 结构体 内存对齐 内存对齐 结构体大小 S5DUD10BN083MHEJEX7TP...

网友评论

      本文标题:结构体内存分析以及指向结构体的指针

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