社区
C语言
帖子详情
sizeof(testStruct)的值为什么是:16,而不是12 ???
freespider
2003-11-18 12:20:32
struct testStruct
{
int nNum;
double dValue;
};
sizeof(testStruct)的值为什么是:16,而不是12 ???
vc60+win2000pro
...全文
152
18
打赏
收藏
sizeof(testStruct)的值为什么是:16,而不是12 ???
struct testStruct { int nNum; double dValue; }; sizeof(testStruct)的值为什么是:16,而不是12 ??? vc60+win2000pro
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
cout<<
sizeof
(
test
Struct
); return 0; } cout<<
sizeof
(getEndian()); if (getEndian()==_UNKNOWN_ENDIAN_) { return 0; } return 1; } int getEndian(void) { static int endian=_UNKNOWN_ENDIAN...
指针结构体测试程序
struct
Test
Struct
**ptrArray = (
struct
Test
Struct
**)malloc(n *
sizeof
(
struct
Test
Struct
*)); for(int i = 0; i ; i++) { ptrArray[i] = (
struct
Test
Struct
*)malloc(
sizeof
(
struct
Test
Struct
)); ptrArray...
golang中
struct
和[]byte的相互转换示例
然后,我们创建了一个`SliceMock`实例,将其地址、长度和容量设置为`
Test
Struct
Tobytes`的
值
。最后,通过类型转换,我们将`SliceMock`转换为`[]byte`。 2. **[]byte 转换为
struct
** 将`[]byte`转换回结构体涉及到...
C#中结构体
struct
和字节数组Byte的之间的转换函数
而在网络通信过程中,如TCP/IP协议栈,只能处理原始的字节流,这意味着我们需要将自定义的数据类型转换为字节数组进行传输。同时,在接收到字节数组后还需要将其还原回原始的结构体形式,以便进一步处理。 ### 示例...
C#结构体和C++字节数组的转换
在跨语言通信或数据交换中,尤其是在涉及到C#与C++之间进行TCP通信时,由于两者数据表示方式的差异,可能会遇到将C#中的结构体转换为C++可理解的字节数组,或者反过来的过程。本文将详细介绍如何在C#中实现结构体与...
C语言
70,037
社区成员
243,243
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章