C语言结构体内存分配详情
#include <stdio.h> int main()
{
/***************************************************
*
* 结构体内存分析(注意结构体里面定义成员结束后要使用分号):
* struct Date
* {
* int year;
* int month;
* int day;
* };
* struct Student
* {
* int age;
* char sex;
* };
* struct Stu
* {
* int age;
* char a;
* char b;
* char c;
* char d;
* };
* 理论上:结构体所占用的存储空间是各个成员变量所占的存储空间之和。
* 但是由于性能等原因分配内存是按照补齐算法进行分配。
* 补齐算法(对齐算法):结构体所占用的存储空间,必须是所有成员中占用存储空间最大的成员的倍数
* 结构体成员内存分配:分配内存是按照高位寻址,但是结构体分配内存时,把低位内存分配给最先定义的变量
* 注意:
* 1.定义结构体类型(并不会分配存储空间)
* 2.定义结构体变量(真正分配存储空间)
*
****************************************************/
struct Date
{
int year;
int month;
int day;
};
printf("Date类型占用的存储空间是:%d\n", sizeof(struct Date));
struct Student
{
int age;
char sex;
};
printf("Student类型占用的存储空间是:%d\n", sizeof(struct Student));
struct Stu
{
int age;
char a;
char b;
char d;
};
printf("Stu类型占用的存储空间是:%d\n", sizeof(struct Stu));
struct St
{
int age;
char a;
char b;
char d;
};
printf("St类型占用的存储空间是:%d\n", sizeof(struct St));
struct Date date = {, , };
printf("date变量的地址是:%p\n", &date);
printf("year变量的地址是:%p\n", &date.year);
printf("month变量的地址是:%p\n", &date.month);
printf("day变量的地址是:%p\n", &date.day);
return ;
}
Date类型占用的存储空间是:
Student类型占用的存储空间是:
Stu类型占用的存储空间是:
St类型占用的存储空间是:
date变量的地址是:0022fee4
year变量的地址是:0022fee4
month变量的地址是:0022fee8
day变量的地址是:0022feec
C语言结构体内存分配详情的更多相关文章
- C#new出来的结构体内存分配在堆上
如题,有同事说因为结构体是值类型,所以 new出来的也是分配在栈上的.我的直觉是但凡使用new的东西都在堆上分配内存,除非C#对结构体做了特殊处理. new int[10]这个说明不了什么,因为数组是 ...
- C语言-结构体内存对齐
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- go语言结构体内存对齐
cpu要想从内存读取数据,需要通过地址总线,把地址传输给内存,内存准备好数据,输出到数据总线,交给cpu,如果地址总线只有8根,那这个地址就只有8位可以表示[0,255]256个地址,因为表示不了更多 ...
- C语言中结构体内存存储方式
C语言中结构体内存存储方式 结构体的默认存储方式采用以最大字节元素字节数对其方式进行对齐,例如一个结构体中定义有char.int类型元素,则结构体存储空间按照int类型占用字节,如果还有double类 ...
- C语言之结构体内存的对齐
C语言之结构体内存的对齐 大纲: 零.引例 一.结构体内存对齐规则 二.怎样计算结构体的大小 三.设计结构体时要注意的方面 四.为什么存在内存对齐 五.修改默认对齐数 在前面的章节中,我们谈到了C ...
- 【APUE】Chapter17 Advanced IPC & sign extension & 结构体内存对齐
17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...
- 关于结构体内存对齐方式的总结(#pragma pack()和alignas())
最近闲来无事,翻阅msdn,在预编译指令中,翻阅到#pragma pack这个预处理指令,这个预处理指令为结构体内存对齐指令,偶然发现还有另外的内存对齐指令aligns(C++11),__declsp ...
- struct结构体内存大小
一. 基本原则 1. struct中成员变量的声明顺序,与成员变量对应的内存顺序是一致的: 2. struct本身的起始存储地址必须是成员变量中最长的数据类型的整倍数,注意是最长的数据类型,而不是最长 ...
- C++ struct结构体内存对齐
•小试牛刀 我们自定义两个结构体 A 和 B: struct A { char c1; char c2; int i; double d; }; struct B { char c1; int i; ...
随机推荐
- [已解决]报错:have mixed types. Specify dtype option on import or set low_memory=False
报错代码: import pandas as pd pd1 = pd.read_csv('D:/python34/program/wx_chat_single/qq_single.csv') 报错内容 ...
- 19-python基础-进制之间的转换
二进制-八进制-十进制-十六进制相互转换 1.十进制转为其他进制 # (1)十进制转二进制 a = 8 bin(a) --->>'0b1000' # (2)十进制转八进制 oct(a) - ...
- spring中@注解的相关解释
@Component:@Controller:@Service:@Repository 在annotaion配置注解中用@Component来表示一个通用注释用于说明一个类是一个spring容器管理的 ...
- linux调用本地镜像
首先先让系统显示出来 iso 已经挂载 然后#mkdir /mnt/cdrom #mount /dev/cdrom /mnt/cdrom #df -H 查看是否已经挂载上 #cd /etc/ ...
- 安装docker-ce与卸载(centos 7)
1.安装依赖 docker依赖于系统的一些必要的工具,可以提前安装. 1 yum install -y yum-utils device-mapper-persistent-data lvm2 2.添 ...
- goto和函数调用
goto: 函数调用: 作用域 label在函数内定义,所以函数内 跳转操作 无条件 调用时先保存现场,复制实际参数,然后才是跳转 生存期 由于不是左值,它没有生存期,仅在编译期有意义. ...
- element 的时间快捷键
1. <div> <el-date-picker v-model="value4" type="month" :picker-options= ...
- Delphi ADOQuery的 DisableControls 和 EnableControls方法
DisableControls方法是在程序修改或后台有刷新记录的时候切断数据组件,如TTABLE.ADOQUERY等等与组件数据源的联系.如果没有切断,数据源中只要一有数据的改动,尤其是批量改动的话, ...
- Dataphin支持哪些数据源
业务数据存储是业务系统最基本的构成,构建数据中台,就是要将这些数据集中起来放到一个有更强算力的地方集中处理,所以对于数据集成的能力是构建数据中台最基本要求: 从存储的发展历程来看,由于不同的业务场景需 ...
- sql 数据库
在关系数据库中,最常用的操作就是查询.直线电机推杆 准备数据 为了便于讲解和练习,我们先准备好了一个students表和一个classes表,它们的结构和数据如下: students表存储了学生信息: ...