十天学会C语言

第09天C语言(12):结构体-内存存储细节

2017-07-12  本文已影响24人  liyuhong
一、概念
/*
 注意: 定义结构体类型 并不会 分配存储空间
 只有定义结构体变量 才会 真正的分配存储空间
 
  结构体 会首先找到 所有属性 中 占用内存存储空间最大的那个属性,然后按照该属性的倍数类型分配存储空间
  1.找到结构体类型 中 占用存储空间最大的属性, 以后就按照 该属性 占用的存储空间1 来分配(在当前这种情况 每次分配8个字节)
  2.会从第0个属性 开始分配存储, 如果存储空间 不够 就会重新分配,如果存储空间 还有剩余, 那么就会把后面的属性的数据存储到剩余的存储空间中

 */
二、代码
#include <stdio.h>
int main()
{
    /*
    // 1.内存寻址 从大到小
    // 2.存储数组元素从小到大
    // 3.数组的地址 就是数组首元素的地址
    int nums[3] = {1,3,5};
    
    
    // 注意: 定义结构体类型 并不会 分配存储空间
    // 只有定义结构体变量 才会 真正的分配存储空间
    struct Person
    {
        int age;    // 4
        int height; // 4
        int width;  // 4
    };
    
    struct Person p;
    // 从当前看来, 结构体变量 所占用的存储空间 就是它 所有属性所占用存储空间的总和
    printf("size = %lu\n",sizeof(p));
    
    printf("age = %p\n",&p.age);
    printf("height = %p\n",&p.height);
    printf("width = %p\n",&p.width);
    
    
    // 结构体名称 并不是 结构体的地址
    // 结构体的地址 就是他 第0个属性的地址
    printf("p = %p\n",&p);
     */
    
#pragma 结构体是如何分配存储空间的
    // 结构体 会首先找到 所有属性 中 占用内存存储空间最大的那个属性,然后按照该属性的倍数类型分配存储空间
    // 1.找到结构体类型 中 占用存储空间最大的属性, 以后就按照 该属性 占用的存储空间1 来分配(在当前这种情况 每次分配8个字节)
    // 2.会从第0个属性 开始分配存储, 如果存储空间 不够 就会重新分配,如果存储空间 还有剩余, 那么就会把后面的属性的数据存储到剩余的存储空间中
    /*
     // 16
    struct Person
    {
        double height; // 8
        int age;       // 4
        char c;        // 1
    };
    
    struct Person sp;
    printf("size = %lu",sizeof(sp));
     */
    
    /*
     // 24
    struct Person
    {
        int age;       // 4
        double height; // 8
        char c;        // 1
    };
    
    struct Person sp;
    printf("size = %lu",sizeof(sp));
     */
    
    // 3. 会从第0个属性 开始分配存储,如果存储空间不够 就会重新分配,并且会将当前属性的值 直接存储到新分配的存储空间中,以前剩余的存储空间就不要了
    struct Person
    {
        int age;       // 4
        double height; // 8
        char c;        // 1
    };
    
    struct Person sp;
    printf("size = %lu",sizeof(sp));
    
    // 注意 : 为什么要安装 所有属性中 占用存储空间最大的属性的字节 来分配存储空间呢?
    // 主要是为了 提高计算机的运算速度
    
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读