C语言中结构体内存存储方式
C语言中结构体内存存储方式
结构体的默认存储方式采用以最大字节元素字节数对其方式进行对齐,例如一个结构体中定义有char、int类型元素,则结构体存储空间按照int类型占用字节,如果还有double类型元素,则结构体存储空间按double类型占用字节对其。针对该特性特意编写如下测试代码:
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int i = 0;
printf("struct test...\r\n"); struct _s
{
unsigned char elem;
unsigned int elem1; /*int 存储空间为4字节*/
}s = {3, 4}; struct _t
{
unsigned char elem;
unsigned int elem2;
double elem1; /*double 存储空间为8字节*/
}t = {8, 9, 9.9}; struct _y
{
unsigned char elem;
double elem1; /*double 存储空间为8字节*/
unsigned int elem2;
}y; printf("int char = %d\r\n", sizeof(int)/sizeof(char));
printf("float char = %d\r\n", sizeof(float)/sizeof(char));
printf("double char = %d\r\n", sizeof(double)/sizeof(char));
printf("struct _y char count = %d\r\n", sizeof(struct _y)/sizeof(char)); /* 默认输出 */
printf("struct _s char count = %d\r\n", sizeof(struct _s)/sizeof(char));
for( i=0; i< sizeof(struct _s)/sizeof(char); ++i)
printf("index %d = %d, ", i, *((unsigned char*)(&s)+i)); printf("struct _t char count = %d\r\n", sizeof(struct _t)/sizeof(char));
for( i=0; i< sizeof(struct _t)/sizeof(char); ++i)
printf("index %d = %d, ", i, *((unsigned char*)(&t)+i)); /* 将struct _s的存储空间所有字节赋值为0 */
for( i=0; i< sizeof(struct _s)/sizeof(char); ++i)
*((unsigned char*)(&s)+i) = 0;
s.elem = 2;
s.elem1 = 5; for( i=0; i< sizeof(struct _t)/sizeof(char); ++i)
*((unsigned char*)(&t)+i) = 0;
t.elem = 8;
t.elem2 = 9.9;
t.elem1 = 6; printf("\r\nstruct _s char count = %d\r\n", sizeof(struct _s)/sizeof(char));
for( i=0; i< sizeof(struct _s)/sizeof(char); ++i)
printf("index %d = %d, ", i, *((unsigned char*)(&s)+i)); printf("\r\nstruct _t char count = %d\r\n", sizeof(struct _t)/sizeof(char));
for( i=0; i< sizeof(struct _t)/sizeof(char); ++i)
printf("index %d = %d, ", i, *((unsigned char*)(&t)+i)); return 0;
}
编译运行上述代码,结构体_s, _t, _y的存储空间分别为8,16,24。对比可知结构体存储空间大小能被结构体空间最大元素占用字节数整除,并且如果相邻元素空间大小累加小于单位最大空间大小,会尝试再次累加,累加如果大于最大空间大小,则选择扩充之前元素的空间大小。
C语言中结构体内存存储方式的更多相关文章
- C语言中结构体内存对齐
先写一个小程序: #include<stdio.h> struct student { int a; char k; short m; }; int main() { st ...
- C语言之结构体内存的对齐
C语言之结构体内存的对齐 大纲: 零.引例 一.结构体内存对齐规则 二.怎样计算结构体的大小 三.设计结构体时要注意的方面 四.为什么存在内存对齐 五.修改默认对齐数 在前面的章节中,我们谈到了C ...
- 关于结构体内存对齐方式的总结(#pragma pack()和alignas())
最近闲来无事,翻阅msdn,在预编译指令中,翻阅到#pragma pack这个预处理指令,这个预处理指令为结构体内存对齐指令,偶然发现还有另外的内存对齐指令aligns(C++11),__declsp ...
- C语言结构体内存分配详情
#include <stdio.h> int main() { /*************************************************** * * 结构体内存 ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- C中结构体的存储分配
C中结构体的存储分配 对于C语言中结构体所占的存储空间的大小,也一直是笔试面试的常客,今天好好看了一下这方面,以前一直以为很清楚了,今天通过各种实际测试举例,发现原来还是没有搞透彻,好在现在是彻底懂了 ...
- C++ struct结构体内存对齐
•小试牛刀 我们自定义两个结构体 A 和 B: struct A { char c1; char c2; int i; double d; }; struct B { char c1; int i; ...
- 【APUE】Chapter17 Advanced IPC & sign extension & 结构体内存对齐
17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...
- C语言_了解一下C语言中的四种存储类别
C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. C语言中的四种存储类别:auto ...
随机推荐
- CSS实现响应式布局
用CSS实现响应式布局 响应式布局感觉很高大上,很难,但实际上只用CSS也能实现响应式布局要用的就是CSS中的没接查询,下面就介绍一下怎么运用: 使用@media 的三种方法 1.直接在CSS文件中使 ...
- CSS+JS相应式导航菜单
响应式导航菜单 响应式导航菜单就是当网页在其他不同视口的样式,不同的设备需要不同的样式 需要掌握的知识 - 掌握媒体查询,如果你不是很懂那就看我写的CSS响应式布局 掌握CSS重的display:no ...
- OAuth 流程与发展总结 (1.0 => 1.0a => 2.0)
OAuth 流程与发展 (1.0 => 1.0a => 2.0) 概述 概述: 开放授权协议 作用: 允许第三方应用访问服务提供方中注册的终端用户的部分资源 下面是官方描述: [OAuth ...
- golang切片
切片与数组 go的数组是这样的 array := [3]int{1,2,3} array := [...]int{1,2,3} go的切片 array := []int{1,2,3} //1 arra ...
- vue开发路由相关基础知识和笔记
路由实现:hash模式 和 history模式 hash模式: 概述 在浏览器中符号"#",#以及#后面的字符称之为hash,用window.location.hash读取: 特点 ...
- DEX文件解析---2、Dex文件checksum(校验和)解析
一.checksum介绍 checksum(校验和)是DEX位于文件头部的一个信息,用来判断DEX文件是否损坏或者被篡改,它位于头部的0x08偏移地址处,占用4个字节,采用小端序存储. ...
- ZXingObjC直接引用第三方工程使用方法
1.下载ZXingObjc压缩包,解压缩. 2.将文件拷贝到项目工程目录下 3.到工程目录中ZXingObjc文件夹中将ZXing的执行文件拖拽到项目中. 4.点击项目targets ——>Bu ...
- 2019-2020-2 20175226 王鹏雲 网络对抗技术 Exp2 后门原理与实践
2019-2020-2 20175226 王鹏雲 网络对抗技术 Exp2 后门原理与实践 实验内容 使用netcat获取主机操作Shell,cron启动: 使用socat获取主机操作Shell, 任务 ...
- API服务版本控制 Microsoft.AspNetCore.Mvc.Versioning
我们在进行webapi服务开发时,会遇到一些多个版本的api共存的情况发生,例如某一版本APP上线后,需求发生变更,需要在下一个升级版本更新API,但同时又需要保证这个APP版本能正常使用,这时候就需 ...
- 从源码看 PHP 7 数组的实现
本文所用源码为 PHP 7.4.4 的版本. PHP 7 数组概述 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当 ...