加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

c判断两个结构体内容相等(不能通过内存判断)

(2018-10-11 12:27:02)
分类: 嵌入式软件
from:https://blog.csdn.net/qq_16097611/article/details/74539663

结构体

  1. typedef struct A {
  2. short short_num;
  3. int int_num;
  4. } A;
A结构体为8字节, short_num自动补齐到4字节,而多余的2个字节,不会自动置为0


如:

  1. #include
  2. typedef struct A {
  3. short short_num;
  4. int int_num;
  5. } A;
  6. int main() {
  7. A a;
  8. a.short_num = 3;
  9. a.int_num = 3;
  10. printf("%d,%d\n", a.short_num, a.int_num);
  11. return 0;
  12. }

通过gcc -S得到汇编代码:
  1. subq $16, %rsp
  2. movw $3, -16(%rbp)
  3. movl $3, -12(%rbp)

其中movw是16位, movl是32位,其中均是将3赋值,但是中间没有任何置0的操作。

另通过gdb查看

  1. (gdb) x/8xb &a
  2. 0x7fffffffdbc0: 0x03 0x00 0xff 0xff 0x03 0x00 0x00 0x00

系统环境为小端:因此这里的short_num对应的为 0x03 0x00 0xff 0xff, 可见补齐的两个字节并没有置0,还有可能是其他的数值

因此对于有补齐类型的结构体,其是不能通过判断内存存储的值是否相等而判断两个结构体是否相等的。

在实现map的key时可能更需要注意到这点。


0

阅读 收藏 喜欢 打印举报/Report
前一篇:2018年10月10日
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有