热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于C语言结构体对齐的困惑

近来为了弄明白C语言中的结构体对齐,利用VC6.0调试一个小程序的时候,有些困惑,恳请大家帮忙看看,谢谢了具体代码如下:#includestdafx.h#include<
近来为了弄明白C语言中的结构体对齐,利用VC6.0调试一个小程序的时候,有些困惑,恳请大家帮忙看看,谢谢了
具体代码如下:

#include "stdafx.h"
#include 
#include 

struct MINE {
char cc;
short ss;
//int ii;
float ff;
double dd;
};

int main(void) {

printf("%d\n",sizeof(struct MINE)); 
return 1;
}

运行结果是16;
当把MINE结构体中的int ii前的注释去掉之后,运行结果却是24,这是怎么回事呢?怎么会突然增加了8个字节呢?
第一次发帖,只给6分,希望大家不要介意啊

10 个解决方案

#1


费解。。

#2


找了下原因,double型要按8字节地址对齐。
char cc;           [0]
short ss;           [2],[3]
int ii;             [4],[5],[6],[7]
float ff;            [8],[9],[10],[11]
到了double dd; 
它不能从[12]开始,只能从[16]开始,所以结果就是24咯。。。

#3


而之前是
char cc;          [0] 
short ss;          [2],[3] 
float ff;           [4],[5],[6],[7] 
double dd;           [8],[9],[10],[11] ....[16]
所以是16字节咯

#4


struct MINE { 
char cc; 
short ss; 
//int ii; 
float ff; //没有ii,前面大小是4,float大小是4,对齐
double dd; //前面大小是8,double是8,对齐,所以MINE大小是16
}; 

struct MINE { 
char cc; 
short ss; 
int ii; 
float ff; //前面大小是8,float大小是4,对齐
double dd; //前面大小是12,double是8,不对齐,前面必须8的倍数,所以补4个字节,这时MINE大小是24
}; 

#5


short是二字节对齐,int和float是四字节对齐,double是八字节对齐,
即:short的起始地址是二的倍数,int和float是四的倍数,double是八的倍数,
按这样的解释,你应该知道为什么16扩大了8个字节
当没有int时:char占一个字节,后面还要加一个空白字节,为了使short的起始地址是二的倍数,
其后紧跟float四个字节,和double的八个字节,总共:16个字节

有了int时,char占一个字节,后面还要加一个空白字节,为了使short的起始地址是二的倍数,
其后紧跟int的四个字节和float四个字节,——然后再加四个空白字节,为了使double的起始
地址是8的倍数。这样一算,总共是不是:24,哈哈。

#6


google
字节对齐

#7


哦,谢谢hairetz 、e_sharp 和majun01 三位,但是我刚才在Ubuntu下面的Eclipse下用GCC调试的时候得到的结果分别是16和20,这又怎么解释呢?这是因为两种编译器采用不同的方法实现还是因为什么呢?哪一个才是标准的呢?
  当然老去问这种问题是不是有点可笑啊,呵呵,希望大家不要笑我啊,谢谢了

#8


平台实现的不同吧. gint8, guint8, gint16, guint16, gint32, guint32, gint64, guint64这些类型多好, 只可以跨平台...
char, int, float, double这些就不行了............

#9


哈哈..学习了...

不过在tc3.0下面好像就没有这些东西...

#10


哈哈..学习了...

不过在tc3.0下面好像就没有这些东西...

推荐阅读
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • 深入解析C语言中的关键字及其分类
    本文将全面介绍C语言中的关键字,并按照功能将其分为数据类型关键字、控制结构关键字、存储类别关键字和其他关键字四大类,旨在帮助读者更好地理解和运用这些基本元素。C语言中共有32个关键字。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 在C语言编程中,点操作符(.)和箭头操作符(->)用于访问结构体成员,但它们的使用场景和方式有所不同。本文将详细探讨这两种操作符的区别,并通过实例说明如何正确使用。 ... [详细]
  • Hanks博士是一位著名的生物技术专家,他的儿子Hankson对数学有着浓厚的兴趣。最近,Hankson遇到了一个有趣的数学问题,涉及求解特定条件下的正整数x,而不使用传统的辗转相除法。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • HTML前端开发:UINavigationController与页面间数据传递详解
    本文详细介绍了如何在HTML前端开发中利用UINavigationController进行页面管理和数据传递,适合初学者和有一定基础的开发者学习。 ... [详细]
  • 实现系统调用
    实现系统调用一、实验环境​本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标​通过对上述实验原理的认识,相信 ... [详细]
  • 本文提供了一个使用C语言实现的顺序表区间元素删除功能的完整代码示例。该程序首先初始化一个顺序表,然后根据用户输入的数据进行插入操作,最后根据指定的区间范围删除相应的元素,并输出最终的顺序表。 ... [详细]
  • C语言中的指针详解
    1.什么是指针C语言中指针是一种数据类型,指针是存放数据的内存单元地址。计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节, ... [详细]
author-avatar
咖啡的因_411
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有