第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;
}