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 ...
随机推荐
- paddlepaddle目标检测之水果检测(yolov3_mobilenet_v1)
一.创建项目 (1)进入到https://aistudio.baidu.com/aistudio/projectoverview/public (2)创建项目 点击添加数据集:找到这两个 然后创建即可 ...
- 微信小程序学习 动手撸一个校园网小程序
动手撸一个校园网微信小程序 高考完毕,想必广大学子和家长们都在忙着查询各所高校的信息,刚好上手微信小程序,当练手也当为自己的学校做点宣传,便当即撸了一个校园网微信小程序. 效果预览 源码地址:Gith ...
- 使用移动自适应布局+easy mock实现移动界面的简单实现
一.使用easy mock模拟数据 easy mock链接地址 二.自己写移动自适应布局 自己编写主要是利用rem进行宽度栅格布局: html { /* 相当于一个界面适配器,pc以及移动端都可以进行 ...
- 三年前端,面试思考(头条蚂蚁美团offer)
小鱼儿本人985本科,软件工程专业,前端.工作三年半,第一家创业公司,半年.第二家前端技术不错的公司,两年半.第三家,个人创业半年.可以看出,我是个很喜欢折腾的人,大学期间也做过很多项目,非常愿意参与 ...
- vue+element 表单封成组件(1)
作为一名刚接触vue不到一个月的菜鸟,思想还没有从操作DOM转变为数据驱动,看vue的代码处处别扭.组里为了让我熟悉vue交给了我一个将element 表单封装成组件的练手任务.由于开发过程中遇到的表 ...
- JZOJ 1774. 合并果子 (Standard IO)
1774. 合并果子 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 在一个果园里,多多已经将所有的果子打 ...
- Java8 新特性2——强大的Stream API
强大的Stream API Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.简而言之,Stream API 提供 ...
- Python——五分钟带你弄懂迭代器与生成器,夯实代码能力
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是周一Python专题,给大家带来的是Python当中生成器和迭代器的使用. 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉 ...
- markdown简明语法1
目录 Cmd Markdown 简明语法手册 1. 斜体和粗体 2. 分级标题 3. 外链接 4. 无序列表 5. 有序列表 6. 文字引用 7. 行内代码块 8. 代码块 9. 插入图像 Cmd M ...
- 关于QThread使用锁死的探索
在学习使用QT5的时候,发现要使用多线程处理多任务,按照https://www.cnblogs.com/liming19680104/p/10397052.html等很多网上的方法,测试一下,发现我写 ...