社区
C语言
帖子详情
sizeof(testStruct)的值为什么是:16,而不是12 ???
freespider
2003-11-18 12:20:32
struct testStruct
{
int nNum;
double dValue;
};
sizeof(testStruct)的值为什么是:16,而不是12 ???
vc60+win2000pro
...全文
142
18
打赏
收藏
sizeof(testStruct)的值为什么是:16,而不是12 ???
struct testStruct { int nNum; double dValue; }; sizeof(testStruct)的值为什么是:16,而不是12 ??? vc60+win2000pro
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
freespider
2003-11-19
打赏
举报
回复
根据ajsword()说的 ,试了一下,加上
#pragma pack(1)
后,结果都是22了。
__declspec(align(32)) 没看懂意思。
觉得zhouqingyuan(浪帆) 说得有道理,
其实类似的问题不要深究太多,不同的编译器处理方法是不同的。只要知道要进行填充就可以了,
实际用的时候,试验一下就可以了。
vmape
2003-11-18
打赏
举报
回复
同意楼上的说法,即便你用的不是int nNUM,而是用的char str之类更小的类型,得到的也是16
朋友真是细心啊 ^_^
zhouqingyuan
2003-11-18
打赏
举报
回复
因为在VC这个编译器是这样处理的,将所站用空间填充为内部数据最大站用内存整数倍,
这句话说的不是很对,应该是每一段内存占用空间都为那个最大的,不够就填充。
所以声明变量顺序不同,sizeof是不一样的。
zhouqingyuan
2003-11-18
打赏
举报
回复
因为在VC这个编译器是这样处理的,将所站用空间填充为内部数据最大站用内存整数倍,因为sizeof(double)=8;
所以整个的就为8的整数倍。故为16。
其实类似的问题不要深究太多,不同的编译器处理方法是不同的。只要知道要进行填充就可以了,
实际用的时候,试验一下就可以了。
5852
2003-11-18
打赏
举报
回复
mark 我也不是很明白
suisuibianbian
2003-11-18
打赏
举报
回复
Windows确实是这样做的。在为变量/对象分配内存的时候,总是以4字节对齐,
无论你的变量类型是什么。
也就是说,任何一个变量/对象的存储空间都是以4的整数倍的地址开始的。
首先看一段例子:
……
int i1;
char c1;
char c2;
int i2;
cout << "i1:" <<&i1 << "\n";
cout << "c1:" <<(void *)&c1 << "\n";
cout << "c2:" <<(void *)&c2 << "\n";
cout << "i2:" <<&i2 << "\n";
……
输出结果如下:
i1:0012FF4C
c1:0012FF48
c2:0012FF44
i2:0012FF40
char类型的变量是只占用一个字节的,用sizeof(char)得到的结果也会是1。
但在这里我们看到,c1和c2都被分配了4个字节的存储空间.
下面我们稍微做一下改动,将四个变量声明到一个结构中:
struct test
{
int i1;
char c1;
char c2;
int i2;
};
然后在main()中执行以下语句:
test s;
cout << "s.i1:" <<&s.i1 << "\n";
cout << "s.c1:" <<(void *)&s.c1 << "\n";
cout << "s.c2:" <<(void *)&s.c2 << "\n";
cout << "s.i2:" <<&s.i2 << "\n";
结果如下:
s.i1:0012FF50
s.c1:0012FF54
s.c2:0012FF55
s.i2:0012FF58
晕了~~~~~~~~~~~~~~~~这里的c1怎么就给分配了一个字节的空间?
再看c2,更晕了!@#$%^&*怎么给它老人家三个字节空间?
看来在结构中,结构成员的内存分配不总是4字节对齐的了,而是跟变量本身的大小有关了。
fbsd
2003-11-18
打赏
举报
回复
字节对齐方式和是否压缩(pack),在网络通信和电信程序中,需要特别注意,这是这2类行业初入门常犯的错误。
yizhili
2003-11-18
打赏
举报
回复
mark
bluedodo
2003-11-18
打赏
举报
回复
顶
vmape
2003-11-18
打赏
举报
回复
越来越深奥了,关注,帮你们顶
jialiang123
2003-11-18
打赏
举报
回复
to :freespider() 不懂不懂 为什么不一样呢?
winco
2003-11-18
打赏
举报
回复
内存对齐方式不一样而已
hwndhwnd
2003-11-18
打赏
举报
回复
还可以加上__declspec(align(32))
ajsword
2003-11-18
打赏
举报
回复
试试在你的结构体定义前加上:
#pragma pack(1)
rerli
2003-11-18
打赏
举报
回复
又长见识了:)
zhoufanking
2003-11-18
打赏
举报
回复
又长见识了:)
freespider
2003-11-18
打赏
举报
回复
struct testStruct
{
int nNum;
double nValue;
char ch[10];
}
32
struct testStruct
{
double nValue;
int nNum;
char ch[10];
}
24
Jack3
2003-11-18
打赏
举报
回复
to zhouqingyuan(浪帆)
变量申明顺序不同,sizeof是不一样的,
能举个例子么
Test
System
系统对整形数据高位与低位存储顺序的判断 //
Test
System.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "system.h" #include
using namespace std; int checkSystem(void) { typedef
struct
{ CByte a; CWord b; CInt c; }
test
Struct
; if (
sizeof
(CByte)!=1) { cout<<
sizeof
(CByte)<
sizeof(CWord)!=2) { cout<<
sizeof
(CWord)<
sizeof(CInt)!=4) { cout<<
sizeof
(CInt)<
sizeof(
test
Struct
)!=8) { cout<<
sizeof
(
test
Struct
)<
sizeof(getEndian())<
指针结构体测试程序
指针结构体测试程序,编辑环境是vc编辑器,通过此程序可了解指针等的数据结构知识
golang中
struct
和[]byte的相互转换示例
主要介绍了golang中
struct
和[]byte的相互转换示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
C#中结构体
struct
和字节数组Byte的之间的转换函数
在tcp通讯的时候经常会遇到
struct
传输的情况。但是C#中tcp只能传送byte[]类型,于是
struct
与byte相互转化就成为了一个麻烦的事情,这里提供两个方法。
C#结构体和C++字节数组的转换
在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按此方法实现。
C语言
70,020
社区成员
243,265
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章