免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 77h2_eleven
打印 上一主题 下一主题

[C] 为什么判断结构体相等要这么复杂呢? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-07-19 16:18 |只看该作者
memcmp不就是用来比较内存的么,怎么又不能比较了。

[ 本帖最后由 erqb 于 2008-7-19 16:19 编辑 ]

论坛徽章:
0
22 [报告]
发表于 2008-07-19 17:33 |只看该作者
原帖由 MMMIX 于 2008-7-19 16:10 发表

嗯,就是这么个意思。当然,在具体实现的时候编译器完全可以根据具体 cpu 提供的指令进行优化(如直接生成实现此功能的汇编指令),像 memcpy 这种函数一般都是经过高度优化的,在某些情况下直接就是用汇编写的。

删了,我说错了

[ 本帖最后由 zx_wing 于 2008-7-19 17:36 编辑 ]

论坛徽章:
0
23 [报告]
发表于 2008-07-19 17:51 |只看该作者
结构体赋值的时候只是简单的内存copy,它不关心里面的内容如何;但是,判断相等时就复杂了,假如结构体中有指针,而原本的意思是比较指针的内容是否相等,但是如果按照上面内存copy的语意来解释就成了比较指针是否相等了.另外,结构体中可能有为了填充,对齐而提供的内容,对这些部分进行内存比较显然也是不可理的.基于这些,C中不提供=操作符用于比较结构体是否相等,而把这个权利留给了程序员.

[ 本帖最后由 converse 于 2008-7-19 20:33 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
24 [报告]
发表于 2008-07-19 18:34 |只看该作者
原帖由 scutan 于 2008-7-19 14:33 发表

对于C语言来说,它的结构体名称其实只是代表它成员变量的第一个元素。
比如说

struct sa
{
int a;
char buf[10];
};

struct sa ss;

那么如果调用printf("%d\n", ss);与调用printf("%d\n", ss.a ...
你这个第一个元素是int没问题,但两个成员换个位置,用%s打印为什么就core呢?结构体名称只是代表它成员变量的第一个元素是个什么意思?

论坛徽章:
0
25 [报告]
发表于 2008-07-19 20:19 |只看该作者
原帖由 erqb 于 2008-7-19 16:18 发表
memcmp不就是用来比较内存的么,怎么又不能比较了。



用memcmp是不可靠的,比如结构体里有字符数组成员。呵呵,自问自答。

论坛徽章:
0
26 [报告]
发表于 2008-07-19 20:41 |只看该作者
原帖由 THEBEST 于 2008-7-19 18:34 发表
你这个第一个元素是int没问题,但两个成员换个位置,用%s打印为什么就core呢?结构体名称只是代表它成员变量的第一个元素是个什么意思?


我是这样理解的, 结构体的名称只是代表这个结构体里面成员的第一个变量的基本类型, 也就是说对于前面那个结构体来说, 它仅代表一个 char 类型,
可以用 printf("%c\n", mm); 来打印出buf[0]出来, 但是却不能够打印出整个数组.

之所以core的原因是那条语句的作用就相当于是 char c = 'h'; printf("%s\n", c); 对一个char类型用%s的方式打印, 所以就出了问题.
当然, 我说的那种用法是不合法的. 应该避免.

论坛徽章:
0
27 [报告]
发表于 2008-07-19 22:09 |只看该作者
原帖由 scutan 于 2008-7-19 20:41 发表


我是这样理解的, 结构体的名称只是代表这个结构体里面成员的第一个变量的基本类型, 也就是说对于前面那个结构体来说, 它仅代表一个 char 类型,
可以用 printf("%c\n", mm); 来打印出buf[0]出来, 但是却不能 ...


你的理解是错误的。

用你的例子来说:
struct sa
{
int a;
char buf[10];
};
struct sa ss;
printf("%d\n", ss); 与调用printf("%d\n", ss.a) 的效果是两码事,虽然在这里结果是一样。

用结构体作参数是压整个结构体,这里 ss 参数是压整个 ss 结构, ss.a 是仅传数 ss.a

若 buf 与 a 换一下,错误就能体现出来的。
printf("%s\n", ss);  就将 bu f数组里的值作为指针来求输出,所以产生fault

论坛徽章:
0
28 [报告]
发表于 2008-07-19 22:21 |只看该作者
原帖由 mik 于 2008-7-19 22:09 发表


你的理解是错误的。

用你的例子来说:
struct sa
{
int a;
char buf[10];
};
struct sa ss;
printf("%d\n", ss); 与调用printf("%d\n", ss.a) 的效果是两码事,虽然在这里结果是一样。

用结构 ...


非常感谢. 学习了!

论坛徽章:
0
29 [报告]
发表于 2008-07-19 22:39 |只看该作者
原帖由 mik 于 2008-7-19 22:09 发表


你的理解是错误的。

用你的例子来说:
struct sa
{
int a;
char buf[10];
};
struct sa ss;
printf("%d\n", ss); 与调用printf("%d\n", ss.a) 的效果是两码事,虽然在这里结果是一样。

用结构 ...



这个解释太赞了!!用到了好多方面的细节知识。

论坛徽章:
0
30 [报告]
发表于 2008-07-19 23:39 |只看该作者
C中对运算符的定义就是这样的.有什么办法.
而且C不支持运算符的重载的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP