c++结构体与c语言的不同,同一个结构体,为何C++和C输出的结果不同

这篇博客探讨了C++和C中结构体内存布局的差异,导致同一结构体在两种语言环境下使用printf打印结果不同的原因。作者通过示例展示了不同内存对齐设置如何影响结构体成员的偏移量,并提供了计算结构体成员偏移的宏定义。文章强调理解内存对齐在跨语言调用时的重要性,并提供了相关调试技巧。
摘要由CSDN通过智能技术生成

同一个结构体,为什么C++和C输出的结果不同,

无意间输出格式定义为hhu,发现个问题,

同一个结构体,

如果在 C      中printf("%hhu",sEyePoint[0]);得出结果64

如果在 C++ 中printf("%hhu",sEyePoint[0]);得出结果32

struct XingZhuang

{

int    leftTop;

int    rightTop;

int    leftBottom;

int    rigthBottom;

float  pai;

};

struct XingZhuang  xingzhuang[100];

nSample = _TestXingZhuang(xingzhuang);

printf("%hhu",sEyePoint[0]);

用C++调用,得出 32

用C  调用,得出 64

------解决方案--------------------

#include 

#define field_offset(s,f) (int)(&(((struct s *)(0))->f))

struct AD  { int a; char b[13]; double c;};

#pragma pack(push)

#pragma pack(1)

struct A1  { int a; char b[13]; double c;};

#pragma pack(2)

struct A2  { int a; char b[13]; double c;};

#pragma pack(4)

struct A4  { int a; char b[13]; double c;};

#pragma pack(8)

struct A8  { int a; char b[13]; double c;};

#pragma pack(16)

struct A16 { int a; char b[13]; double c;};

#pragma pack(pop)

int main() {

printf("AD.a %d\n",field_offset(AD,a));

printf("AD.b %d\n",field_offset(AD,b));

printf("AD.c %d\n",field_offset(AD,c));

printf("\n");

printf("A1.a %d\n",field_offset(A1,a));

printf("A1.b %d\n",field_offset(A1,b));

printf("A1.c %d\n",field_offset(A1,c));

printf("\n");

printf("A2.a %d\n",field_offset(A2,a));

printf("A2.b %d\n",field_offset(A2,b));

printf("A2.c %d\n",field_offset(A2,c));

printf("\n");

printf("A4.a %d\n",field_offset(A4,a));

printf("A4.b %d\n",field_offset(A4,b));

printf("A4.c %d\n",field_offset(A4,c));

printf("\n");

printf("A8.a %d\n",field_offset(A8,a));

printf("A8.b %d\n",field_offset(A8,b));

printf("A8.c %d\n",field_offset(A8,c));

printf("\n");

printf("A16.a %d\n",field_offset(A16,a));

printf("A16.b %d\n",field_offset(A16,b));

printf("A16.c %d\n",field_offset(A16,c));

printf("\n");

return 0;

}

//AD.a 0

//AD.b 4

//AD.c 24

//

//A1.a 0

//A1.b 4

//A1.c 17

//

//A2.a 0

//A2.b 4

//A2.c 18

//

//A4.a 0

//A4.b 4

//A4.c 20

//

//A8.a 0

//A8.b 4

//A8.c 24

//

//A16.a 0

//A16.b 4

//A16.c 24

//

//

------解决方案--------------------

引用如果在 C      中printf("%hhu",sEyePoint[0]);得出结果64

如果在 C++ 中printf("%hhu",sEyePoint[0]);得出结果32

sEyePoint是什么?

------解决方案--------------------

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:

眼过千遍不如手过一遍!

书看千行不如手敲一行!

手敲千行不如单步一行!

单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。

对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值