使用memcmp比较一个结构体

sd666850 2010-04-13 12:43:21
使用memcmp比较一个结构体
...全文
901 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinzaiyiqi 2010-04-13
  • 打赏
  • 举报
回复
不懂,帮顶
sd666850 2010-04-13
  • 打赏
  • 举报
回复
使用memcmp比较一个结构体
typedef struct part
{
int no;
int sockaddrLen;
union
{
int height;
char[8] name;
}u;
}part;

typedef struct part2
{
int no;
int sockaddrLen;
union
{
int height;
char[16] name;
}u;
}part2;

typedef struct student
{
int no;
int length;
union
{
part student_part;
part2 stuent_part2;
}u;
}student;

结构体大致如上,比较student这个结构体,使用的u.student_part,其中no、lenggth,u.student_part里面的每个值都是相等的(通过单独比较可以比较出来),但是使用了memcmp比较之后就返回不相当,我开始以为是长度大小不一致造成的,后来我把比较的对象长度也比较了,还是一样的,有谁知道为什么啊?
xrayseven 2010-04-13
  • 打赏
  • 举报
回复
受教了。
sd666850 2010-04-13
  • 打赏
  • 举报
回复
谢谢大家的解答,我打印出内存来看,确实是因为没有初始化的原因,有些想当然了。
因为是union,part2比part所占的内存空间大,它多出来的那一部分,没有初始化,希望大家不要再犯我这样的错误啊
yanran_hill 2010-04-13
  • 打赏
  • 举报
回复
gdb 运行到断点,然后显示内存,比如显示ptr指针指向的10字节内存
x /10uh ptr

VS2008 直接打开内存查看器,查看就行了
sd666850 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 yanran_hill 的回复:]
就算结构体里的成员的值全都一样,也不能说内存就一样了,真正的内存大小(sizeof(student))有要大于所有的成员的sizeof()相加,所以在赋初值得时候,可能有部分内存区的值,是任意的
建议楼主把内存的内容打印出来看看
[/Quote]
我是菜鸟,还不会打印内存,怎么打印啊?
赵4老师 2010-04-13
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
third8923 2010-04-13
  • 打赏
  • 举报
回复
看出来了结构里面还有联合!如果你的结构里面包含其他结构体 指针之类的!你用内存比较能得出相等还是同一啊?哥们!结构中有指针啊
aichongqu 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 lbjfeng 的回复:]

既然是同一个结构体类型的,怎么会有对齐的差异~~

所以,memcmp觉对使得
[/Quote]
绝对不存在对齐的差异,但是会因为对齐产生的“漏洞”补齐而导致隐藏的内存区域没有被赋值
wjz748305545 2010-04-13
  • 打赏
  • 举报
回复
我把高手顶来
lbjfeng 2010-04-13
  • 打赏
  • 举报
回复
既然是同一个结构体类型的,怎么会有对齐的差异~~

所以,memcmp觉对使得
hacker1125 2010-04-13
  • 打赏
  • 举报
回复
用法是没有错的。
我怀疑是楼主再内容赋值不一样,也就是初始化不一样。
不然结构都一样,在定义2个对象后,用memset初始化为一致,然后调用memcmp看看
aichongqu 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 localxiao 的回复:]

按道理编译器在赋值的时候,内存对齐的填充区域的字节应该是相同的才对吧
[/Quote]
貌似按道理是应该清零
third8923 2010-04-13
  • 打赏
  • 举报
回复
结构体比较肯定是只能逐个域比较不能用memcmp.到不是我懂得多主要是我刚看到本书说到结构体比较的问题
编译器没有简单的好办法实现结构比较(即, 支持结构的== 操作符),
这也符合C 的低层特性。简单的按字节比较会由于结构中没有用到的“空洞” 中
的随机数据(参见问题2.10) 而失败; 而按域比较在处理大结构时需要难以接受的
大量重复代码。
如果你需要比较两个结构, 你必须自己写函数按域比较。

这些“空洞” 充当了“填充”, 为了保持结构中后面的域的对齐, 这也许是必须
的。为了高效的访问, 许多处理器喜欢(或要求) 多字节对象(例如, 结构中任何大
于char 的类型) 不能处于随意的内存地址, 而必须是2 或4 或对象大小的倍数。
编译器可能提供一种扩展用于这种控制(可能是#pragma; 参见问题11.21),
但是没有标准的方法。
所以说结论是不能用内存比较来比较结构体,不过你调用初始化的的内存分配函数也不能保证,因为你不知道对齐的是2还是4,充填的空洞数量可能不同
LittleJohny 2010-04-13
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
hello_kitty8888 2010-04-13
  • 打赏
  • 举报
回复
这个有时会涉及到内存字节对齐问题,19楼写的不错。

NAME
memcmp - compare memory areas

SYNOPSIS
#include <string.h>

int memcmp(const void *s1, const void *s2, size_t n);

DESCRIPTION
The memcmp() function compares the first n bytes of the memory areas s1
and s2. It returns an integer less than, equal to, or greater than
zero if s1 is found, respectively, to be less than, to match, or be
greater than s2.
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 monkeyfeng 的回复:]
引用 13 楼 hairetz 的回复:
如果是相同的结构体,不管是什么内存对齐方式,都可以直接用memcmp。

那为什么我的使用会出现这样的问题呢?有点小郁闷
[/Quote]

申请完内存不memset,然后又期望所有未操作的区域是可控的,这就是你的错。
白云飘飘飘 2010-04-13
  • 打赏
  • 举报
回复
看19楼的,先初始化为0,否则因为字节对齐和/或name赋值时字符串长度小于7有些内容是随机的
yanran_hill 2010-04-13
  • 打赏
  • 举报
回复
就算结构体里的成员的值全都一样,也不能说内存就一样了,真正的内存大小(sizeof(student))有要大于所有的成员的sizeof()相加,所以在赋初值得时候,可能有部分内存区的值,是任意的
建议楼主把内存的内容打印出来看看
localxiao 2010-04-13
  • 打赏
  • 举报
回复
按道理编译器在赋值的时候,内存对齐的填充区域的字节应该是相同的才对吧

加载更多回复(18)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧