visual c++6.0 结构体占存字节的疑问

问题描述

visual c++6.0 结构体占存字节的疑问

程序1:
#include

int main(void)
{
struct stu
{
double a;
int b;
}tex;

printf("%d  %d  %d n", sizeof(stu),  sizeof(tex.a), sizeof(tex.b) );

return 0;

}

结果:16 8 4 //疑问:为什么 sizeof(stu) 不等于 sizeof(tex.a)和 sizeof(tex.b) 的和 12 , 而相差了4个字节?

程序2:
#include

int main(void)
{
struct stu
{
char c;
int b;
} tex;

printf("%d  %d  %d n", sizeof(stu),  sizeof(tex.a), sizeof(tex.c) );

return 0;

}

结果:8 1 4 //疑问:相差3个字节 ?

解决方案

楼主补充:头文件 添加了 stdio.h 这里没有显示出来

解决方案二:

嗨,
这两个问题应该属于内存对齐问题,这里是结构体对齐。

第二个问题中,char c占用1个字节,int b占用4个字节,int b要求4字节对齐,所以结构体变量实际占用的空间为1(c)+3(用于对齐访问)+4(b);

第一个问题有点复杂,根据上面的分析,double应该占用8个字节,int占4个字节,应该占用12字节;但是结构体对齐中还有一点是:结构体会按照内长度最大(这里是double)成员大小对齐,所以结构体实际占用空间为8+4+4(用于结构体8字节对齐);

PS:这些规则还与编译器编译规则有关,比如gcc中的#pragma pack(n)或__attribute__((packed));

希望能帮到你

时间: 2024-11-02 20:53:58

visual c++6.0 结构体占存字节的疑问的相关文章

c++-C++ 6.0结构体数组排序的顺序问题,排序后的顺序规则

问题描述 C++ 6.0结构体数组排序的顺序问题,排序后的顺序规则 C++ 6.0利用函数指针高效排序同时保证结果正确有序的方法是什么?如果结构体中是浮点数字段,具体怎么排序才能正确? 解决方案 参考:http://blog.csdn.net/lethic/article/details/7781203 解决方案二: //C++ 字符数组顺序排序

c++-C++ 6.0结构体字段多重排序的函数指针

问题描述 C++ 6.0结构体字段多重排序的函数指针 C++对结构体数组进行排序,排序结果存在紊乱,库函数的函数指针怎么解决排序紊乱的问题? 解决方案 参考:http://blog.csdn.net/lethic/article/details/7781203 解决方案二: 运算符重载,大于号重新定义,然后直接sort 解决方案三: 需要定义使用结构体的哪个成员作为排序用的key,然后对该key定义小于运算符重载,进行排序.

char-这个结构体占据多少字节呢 请指教

问题描述 这个结构体占据多少字节呢 请指教 typedef struct _person{ char firstname;char lastname;char * title;unsigned int age;char sex;struct spring ls; }Person;这个结构体占据多少字节 解决方案 不是简单相加就好了的,要考虑对齐问题,所以与spring结构关系很大,我用你的这个结构做了一点小实验,结果会根据spring中内置变量的不同而有挺大变化的哦http://blog.csd

一道用 sizeof 求结构体所占大小的笔试题?求教

问题描述 一道用 sizeof 求结构体所占大小的笔试题?求教 下列程序,为什么输出的结果是 120? int main(int argc, char* argv[]) { union u_type { int i; double x; float f; }; struct str_type { char str[100]; union u_type u[2]; }; printf("%dn",sizeof(struct str_type)); } 解决方案 首先union u_typ

深入剖析C++中的struct结构体字节对齐_C 语言

什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证

实例讲解C语言编程中的结构体对齐_C 语言

Q:关于结构体的对齐,到底遵循什么原则? A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况: #include <stdio.h> #include <string.h> #define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue)); #define OFFSET(struct,member) ((char *)&((struct *)0)->member - (

在C#里面调用带有回调函数和自定义结构体的DLL的例程

函数 开发环境: WinXP Pro(SP2英文版) + VS.NET 2003中文版接口库版本: CMPP2.0 API第二版(V2.6) 该例程演示了如何在C#里面调用VC6.0开发的带回调函数的API,而且回调函数的参数包含结构体,使用C#的委托和IntPtr方法实现. 由于我使用C#刚两天,这是我写的第一个C#程序,因此例程写的可能有点粗糙,但是编译和运行完全没有问题. CMPP2.0的API封装成了标准C调用的方法,提供以下三个接口,使用的时候只要有CMPPAPI.dll就可以了. #

C语言结构体的对齐原则

Q:关于结构体的对齐,到底遵循什么原则? A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况: #include <stdio.h> #include <string.h> #define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue)); #define OFFSET(struct,member) ((char *)&((struct *)0)->member - (

结构体占用内存大小计算

问题描述 结构体占用内存大小计算 第一个我理解为 和 double对齐是16 第二个 是 4*3 = 12 第三个理解为 (1+7)+8= 16 第四个 8* 3 =24: 和运行的出来的结果完全不对啊,,看了好几篇 对齐的文章,,把文章示例抄过来运行都是错的.....感觉我这块理解有 严重误区啊 解决方案 看上去编译器像是4字节对齐,double占两个单位 4+8 4+4+4 4+8 4+8+4 解决方案二: 结构体占内存大小计算struct结构体占内存大小计算struct结构体占内存大小计算