如何比较两结构体是否相等?

辉歌 2001-11-03 08:56:25
struct ElemType;

ElemType a,b,c;
....

...全文
3558 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
new_cooperator 2001-11-11
  • 打赏
  • 举报
回复
同意cber观点,
正的不行就只有依此比较其各个元素了。
San_Daniel 2001-11-11
  • 打赏
  • 举报
回复 1
可以用#pragma pack(1)压抑对齐,用memcmp比较,比重载方便,但寻址会比较慢
liushmh 2001-11-11
  • 打赏
  • 举报
回复
最好是给你的 结构体设置 ID 号
richielee 2001-11-05
  • 打赏
  • 举报
回复
"否则就是按位比较了"
又有一个人说'按位比较'了,看样子还不只是我有这样的误解

实际上对于结构体,C++的'='的确有默认的行为,就是'按位拷贝'
但是'=='没有'按位比较'这样的默认行为,只有自己重载==运算符
cber 2001-11-05
  • 打赏
  • 举报
回复
最好自己重载operator==,否则就是按位比较了(对于有成员指针的结构可能会得到不正确的结果)。
耙子 2001-11-05
  • 打赏
  • 举报
回复
memcmp(&a,&b,sizeof(ElemType); 的确可能有问题,就是上面说的对齐问题,变量间会有多余的废字节,他的内容是随机的。比较可能影响结果。
建议初始化a,b的时候,memset(&a, 0, sizeof(ElemType))一下。
辉歌 2001-11-05
  • 打赏
  • 举报
回复
不会吧?我太失望了。难道是我太懒了吗?
richielee 2001-11-04
  • 打赏
  • 举报
回复
那就没有办法了,我认为你只有比较成员了
辉歌 2001-11-04
  • 打赏
  • 举报
回复
比较a和b的结构成员太复杂了.
richielee 2001-11-04
  • 打赏
  • 举报
回复
为什么不比较a和b的结构成员呢?
cnss 2001-11-04
  • 打赏
  • 举报
回复
不是说了么,除非你能保证STURCT中没有空隙,否则MEMCMP没用
辉歌 2001-11-04
  • 打赏
  • 举报
回复
#include<mem.h>

memcmp(&a,&b,sizeof(ElemType);

编译通过,运行错误.
比较变量a,b的内容是否相等,要怎么做啊?
gigix 2001-11-03
  • 打赏
  • 举报
回复
可以呀,这就是所谓的“内容比较”,即比较两个结构体内“第一层内容”是否相等。如果你想重载operator==,你必须考虑自己的业务逻辑。我一下说不清楚,看看Effective C++吧。
辉歌 2001-11-03
  • 打赏
  • 举报
回复
感谢你的回复,只是我不清楚你要表达什么意思。
我用的是以下方法:
#include<mem.h>

memcmp(&a,&b,sizeof(ElemType);
gigix 2001-11-03
  • 打赏
  • 举报
回复

如果你是用C,那么a==b的比较是指针地址的比较。

如果你用C++而没有重载operator==,同上。

如果你用C++而重载了operator==……你希望它怎样它就怎样。

richielee 2001-11-03
  • 打赏
  • 举报
回复
hehe,你肯定是java的程序编多了,把a和b当'句柄'看了
gigix 2001-11-03
  • 打赏
  • 举报
回复

在C里面a==b有错误?真的吗?——我自己很久没有写C程序,再加上最近是C++和JAVA同时进行,有点乱——难道a==b不是两个地址直接比较吗?难道结构体名不是指针吗?

……

你说得没错!我刚才试过了。必须显式重载operator==才能进行这样的比较。

richielee 2001-11-03
  • 打赏
  • 举报
回复
我错了,在C里面,a==b有语义错误,HOHO,编译不通过
richielee 2001-11-03
  • 打赏
  • 举报
回复
和gigix讨论
a==b 在C里面应该是按字节比较其内容吧?应该不是比较&a和&b
heimeng 2001-11-03
  • 打赏
  • 举报
回复
..
加载更多回复(3)
国外著名高等院校信息科学与技术优秀教材:本书以Scheme语言为基础介,绍计算和程序设计的一般理论,具体讨论了程序设计、基于数据驱动的程序设计基础、程序设计中的抽象问题等。 第一部分 简单数据的处理 18 第1章 学生,教师和计算机 18 第2章 数、表达式和简单程序 19 2.1 数和算术运算 19 2.2 变量和程序 20 2.3 字处理问题 23 2.4 错误 23 2.5 设计程序 25 第3章 程序就是函数加上变量定义 27 3.1 函数复合 28 3.2 变量定义 30 3.3 复合函数练习 31 第4章 条件表达式和函数 32 4.1 布尔类型和关系 32 4.2 函数和测试条件 34 4.3 条件和条件函数 37 4.4 条件函数的设计 39 第5章 非数值信息 42 5.1 符号的手工练习 44 第6章 复合数据之一,结构体 45 6.1 结构体 结构体 45 6.2 补充练习:绘制简单图形 47 6.3 结构体定义 49 6.4 数据定义 52 6.5 设计处理复合数据的函数 53 6.6 补充练习: 圆和长方形的移动 57 6.7 补充练习:刽子手游戏 61 第7章 数据的多样性 62 7.1 数据混合与区分 63 7.2 设计处理混合数据的函数 66 7.3 再论函数复合 69 7.4 补充练习:图形的移动 72 7.5 输入错误 72 第8章 语法和语义 74 8.1 Scheme 的词汇 74 8.2 Scheme 的文法 75 8.3 Scheme 的含义 76 8.4 错误 79 8.5 布尔值表达式 81 8.6 变量定义 82 8.7 结构体的定义 83 第二部分 任意数目数据的处理 86 第9章 复合数据类型之二:表 86 9.1 表 86 9.2 任意长的表的数据定义 89 9.3 处理任意长的表 90 9.4 处理自引用数据的函数 92 9.5 更多关于简单表的例子 94 第10章 表的进一步处理 97 10.1 返回表的函数 97 10.2 包含结构体的表 101 10.3 补充练习:移动图像 105 第11章 自然数 106 11.1 定义自然数 107 11.2 处理任意大的自然数 108 11.3 补充练习:创建表,测试函数 110 11.4 自然数的另一种数据定义 111 11.5 更多与自然数有关的性质 115 第12章 三论函数复合 116 12.1 设计复杂的程序 116 12.2 递归的辅助函数 117 12.3 问题泛化与函数泛化 120 12.4 补充练习:字母的重新排列 123 第13章 用 list 构造表 125 第三部分 再论任意大数据的处理 129 第14章 再论自引用数据定义 129 14.1 结构体中的结构体 129 14.2 补充练习: 二叉搜索树 135 14.3 表中的表 138 14.4 补充练习: Scheme 求值 140 第15章 相互引用的数据定义 141 15.1 由结构体组成的表,结构体中的表 142 15.2 为相互引用的定义设计函数 146 15.3 补充练习:网页再谈 148 第16章 反复精化设计 148 16.1 数据分析 149 16.2 定义数据类型,再改进它们 150 16.3 改进函数和程序 152 第17章 处理种复杂数据 153 17.1 同时处理个表:第一种情况 153 17.2 同时处理个表:第二种情况 155 17.3 同时处理个表:第三种情况 157 17.4 函数的简化 160 17.5 设计读入个复杂输入的函数 161 17.6 处理个复杂输入的练习 162 17.7 补充练习: Scheme 求值之二 165 17.8 相等与测试 166 第18章 局部定义和词汇的范围 172 18.1 用 local 组织程序 172 18.2 辖域和块结构 183 第四部分 抽象设计 187 第19章 定义的相似性 187 19.1 函数的类似之处 187 19.2 数据定义的类似之处 193 第20章 函数也是值 196 20.1 语法和语义 197 20.2 抽象和多态函数的合约 198 第21章 抽象设计的例子 201 21.1 从实例中抽象 201 21.2 抽象表处理函数的练习 205 21.3 抽象与唯一控制点 206 21.4 补充练习:再论移动图像 207 21.5 注意:由模板设计抽象 208 第22章 使用函数设计抽象 209 22.1 返回函数的函数 210 22.2 把函数当成值来设计抽象 211 22.3 图形用户界面初探 213 第23章 数学方面的例子 218 23.1 数列和级数 219 23.2 等差数列和等差级数 220 23.3 等比数列和等比级数 221 23.4 函数曲线下方的面积 223 23.5 函数的斜率 225 第24章 定义匿名函数 229 24.1 lambda 表达式的语法 229 24.2 lambda 表达式的辖域和语义 230 24.3 lambda 表达式的语用 232 第五部分 生成递归 233 第25章 一种新的递归形式 233 25.1 为桌上的一个球建立模型 233 25.2 快速排序 236 第26章 设计算法 239 26.1 终止 240 26.2 结构递归和生成递归的比较 243 26.3 做出选择 243 第27章 主题的变更 246 27.1 分形 247 27.2 从文件到行,从表到表的表 251 27.3 二分查找 254 27.4 牛顿法 258 27.5 补充练习: 高斯消去法 259 第28章 回溯算法 263 28.1 图的遍历 263 28.2 补充练习: 皇后之间的相互阻碍 267 第29章 计算的代价、向量 268 29.1 具体的时间和抽象的时间 269 29.2 “阶”的定义 272 29.3 向量初探 274 第六部分 知识累积 283 第30章 知识的丢失 283 30.1 一个关于结构处理的问题 283 30.2 一个关于生成递归的问题 286 第31章 设计带累积器的函数 288 31.1 认识累积器的必要性 289 31.2 带累积器的函数 289 31.3 把函数转换成带累积器的变体 291 第32章 使用累积器的更多例子 298 32.1 补充练习:有关树的累积器 298 32.2 补充练习:传教士和食人者问题 302 32.3 补充练习:单人跳棋 304 第33章 非精确数的本质 305 33.1 固定长度的数的算术运算 305 33.2 上溢出 309 33.3 下溢出 309 33.4 DrScheme 数 310 第七部分 改变变量的状态 312 第34章 函数的记忆 312 第35章 对变量赋值 315 35.1 简单的、能工作的赋值 315 35.2 顺序计算表达式 316 35.3 赋值和函数 318 35.4 第一个有用的例子 320 第36章 设计有记忆的函数 322 36.1 对记忆的需求 322 36.2 记忆与状态变量 323 36.3 初始化记忆的函数 324 36.4 改变记忆的函数 325 第37章 使用记忆的例子 329 37.1 状态的初始化 329 37.2 与用户交互并改变状态 331 37.3 在递归中改变状态 338 37.4 状态变量的练习 342 37.5 补充练习:探索 343 第38章 最终的语法和语义 345 38.1 Advanced Scheme 的词汇 345 38.2 Advanced Scheme 的语法 345 38.3 Advanced Scheme 的含义 347 38.4 Advanced Scheme 中的错误 357 第八部分 复合值的改变 361 第39章 封装 361 39.1 状态变量的抽象 361 39.2 封装练习 368 第40章 可改变的结构体 369 40.1 由函数得出结构体 370 40.2 可变泛函结构体 372 40.3 可变的结构体 374 40.4 可变的向量 379 40.5 改变变量,改变结构体 380 第41章 设计改变结构体的函数 383 41.1 为什么改变结构体 383 41.2 结构体的设计诀窍与变化器之一 384 41.3 结构体的设计诀窍与变化器之二 392 41.4 补充练习:最后一次移动图像 401 第42章 相等 401 42.1 外延相等 401 42.2 内涵相等 402 第43章 修改结构体、向量和对象 404 43.1 关于向量的更多练习 404 43.2 循环结构体的收集 415 43.3 状态的回溯 423 结语 425 计算 425 程序设计 425 与时俱进 426
《程序设计方法》以Scheme语言为基础介绍计算和程序设计的一般理论和实践。《程序设计方法》由8个部分和7个独立的章节(第8、13、18、24、29、33、38章)组成。8个部分主要讨论程序设计,独立章节则介绍一些与程序设计和计算相关的话题。《程序设计方法》第1至第3部分介绍了基于数据驱动的程序设计基础。第4部分介绍了程序设计中的抽象问题。第5部分和第6部分是与递归及累积相关的内容。《程序设计方法》的最后部分说明了设计程序的意义,阐述了如何应用前6个部分所描述的程序设计诀窍,以及使用赋值语句必须特别小心的一些问题。 《程序设计方法》可作为高等院校计算机科学与技术专业“程序设计导论”和“计算导论”的教材和教学参考书,也可作为函数式语言和Scheme语言的入门教材。 目录 · · · · · · 第一部分 简单数据的处理 第1章 学生、教师和计算机 3 第2章 数、表达式和简单程序 5 2.1 数和算术运算 5 2.2 变量和程序 6 2.3 字处理问题 9 2.4 错误 10 2.5 设计程序 12 第3章 程序就是函数加上变量定义 15 3.1 函数复合 15 3.2 变量定义 17 3.3 函数复合练习 18 第4章 条件表达式和函数 20 4.1 布尔类型和关系 20 4.2 函数和条件测试 22 4.3 条件和条件函数 25 4.4 条件函数的设计 27 第5章 符号信息 31 第6章 复合数据之一:结构体 34 6.1 结构体 34 6.2 补充练习:绘制简单图形 36 6.3 结构体定义 38 6.4 数据定义 41 6.5 设计处理复合数据的函数 43 6.6 补充练习:圆和长方形的移动 46 6.7 补充练习:刽子手游戏 49 第7章 数据的多样性 52 7.1 数据混合与区分 52 7.2 设计处理混合数据的函数 55 7.3 再论函数复合 58 7.4 补充练习:图形的移动 60 7.5 输入错误 61 第8章 语法和语义 63 8.1 Scheme的词汇 63 8.2 Scheme的文法 64 8.3 Scheme的含义 65 8.4 错误 68 8.5 布尔值表达式 70 8.6 变量定义 71 8.7 结构体的定义 72 第二部分 任意数目数据的处理 第9章 复合数据类型之二:表 77 9.1 表 77 9.2 任意长的表的数据定义 80 9.3 处理任意长的表 82 9.4 设计自引用数据定义的函数 84 9.5 更多关于简单表的例子 86 第10章 表的进一步处理 90 10.1 返回表的函数 90 10.2 包含结构体的表 93 10.3 补充练习:移动图片 98 第11章 自然数 100 11.1 定义自然数 100 11.2 处理任意大的自然数 101 11.3 补充练习:创建表,测试函数 103 11.4 自然数的另一种数据定义 104 11.5 更多与自然数有关的性质 108 第12章 三论函数复合 110 12.1 设计复杂的程序 110 12.2 递归的辅助函数 111 12.3 问题泛化与函数泛化 114 12.4 补充练习:字母的重新排列 117 第13章 用list构造表 119 第三部分 再论任意大数据的处理 第14章 再论自引用数据定义 125 14.1 结构体中的结构体 125 14.2 补充练习:二叉搜索树 131 14.3 表中的表 135 14.4 补充练习:Scheme求值 137 第15章 相互引用的数据定义 139 15.1 由结构体组成的表与结构体中的表 139 15.2 为相互引用的定义设计函数 144 15.3 补充练习:网页再谈 145 第16章 反复精化设计 147 16.1 数据分析 147 16.2 定义数据类型,再改进它们 148 16.3 改进函数和程序 150 第17章 处理种复杂数据片段 152 17.1 同时处理个表:第一种情况 152 17.2 同时处理个表:第二种情况 154 17.3 同时处理个表:第三种情况 156 17.4 函数的简化 159 17.5 设计读入个复杂输入的函数 160 17.6 处理个复杂输入的练习 161 17.7 补充练习:Scheme求值之二 164 17.8 相等与测试 165 第18章 局部定义和辖域 172 18.1 用local组织程序 172 18.2 辖域和块结构 183 第四部分 抽象设计 第19章 定义的相似性 189 19.1 函数的类似之处 189 19.2 数据定义的类似之处 195 第20章 函数也是值 199 20.1 语法和语义 199 20.2 抽象函数和多态函数的合约 200 第21章 抽象设计的例子 204 21.1 从实例中抽象 204 21.2 抽
个人学习golang笔记,从各种教程中总结而来,作为入门参考。目录如下 目录 1. 入门 1 1.1. Hello world 1 1.2. 命令行参数 2 2. 程序结构 3 2.1. 类型 4 2.1.1. 命名类型(named type)与未命名类型(unamed type) 4 2.1.2. 基础类型(underlying type) 4 2.1.3. 可赋值性 5 2.1.4. 类型方法集 6 2.1.5. 类型声明 6 2.2. 变量 8 2.2.1. 变量声明 8 2.2.2. 类型零值 12 2.2.3. 指针 13 2.3. 赋值 17 2.4. 包和文件 17 2.5. 作用域 18 2.6. 语句 19 2.7. 比较运算符 20 2.8. 类型转换 21 2.9. 控制流 23 2.9.1. If 23 2.9.2. Goto 24 2.9.3. For 25 2.9.4. Switch 25 2.9.5. break语句 31 2.9.6. Continue语句 31 3. 基础数据类型 31 3.1. golang类型 31 3.2. Numeric types 32 3.3. 字符串 33 3.3.1. 什么是字符串 33 3.3.2. 字符串底层概念 35 3.3.3. 获取每个字节 38 3.3.4. Rune 39 3.3.5. 字符串的 for range 循环 40 3.3.6. 用字节切片构造字符串 41 3.3.7. 用rune切片构造字符串 42 3.3.8. 字符串的长度 42 3.3.9. 字符串是不可变的 42 3.3.10. UTF8(go圣经) 43 3.4. 常量 45 3.4.1. 常量定义 45 3.4.2. 常量类型 46 3.4.3. Iota 46 4. 组合数据类型 47 4.1. 数组 47 4.1.1. 数组概述 47 4.1.2. 数组的声明 49 4.1.3. 数组的长度 50 4.1.4. 遍历数组 50 4.1.5. 多维数组 51 4.2. 切片 52 4.2.1. 什么是切片 52 4.2.2. 切片概述 55 4.2.3. 创建一个切片 55 4.2.4. 切片遍历 57 4.2.5. 切片的修改 58 4.2.6. 切片的长度和容量 60 4.2.7. 追加切片元素 62 4.2.8. 切片的函数传递 65 4.2.9. 多维切片 66 4.2.10. 内存优化 67 4.2.11. nil slice和empty slice 69 4.2.12. For range 70 4.3. 结构 71 4.3.1. 什么是结构体? 71 4.3.2. 结构体声明 73 4.3.3. 结构体初始化 77 4.3.4. 嵌套结构体(Nested Structs) 81 4.3.5. 匿名字段 82 4.3.6. 导出结构体和字段 84 4.3.7. 结构体相等性(Structs Equality) 85 4.4. 指针类型 86 4.5. 函数 87 4.6. map 87 4.6.1. 什么是map 87 4.6.2. 声明、初始化和make 89 4.6.3. 给 map 添加元素 91 4.6.4. 获取 map 中的元素 91 4.6.5. 删除 map 中的元素 92 4.6.6. 获取 map 的长度 92 4.6.7. Map 的相等性 92 4.6.8. map的排序 92 4.7. 接口 93 4.7.1. 什么是接口? 93 4.7.2. 接口的声明与实现 96 4.7.3. 接口的实际用途 97 4.7.4. 接口的内部表示 99 4.7.5. 空接口 102 4.7.6. 类型断言 105 4.7.7. 类型选择(Type Switch) 109 4.7.8. 实现接口:指针接受者与值接受者 112 4.7.9. 实现多个接口 114 4.7.10. 接口的嵌套 116 4.7.11. 接口的零值 119 4.8. Channel 120 4.9. 类型转换 120 5. 函数 120 5.1. 函数的声明 121 5.2. 一个递归函数的例子( recursive functions) 121 5.3. 多返回值 121 5.4. 命名返回值 121 5.5. 可变函数参数 122 5.6. Defer 123 5.6.1. Defer语句介绍 123 5.6.2. Defer使用场景 128 5.7. 什么是头等(第一类)函数? 130 5.8. 匿名函数 130 5.9. 用户自定义的函数类型 132 5.10. 高阶函数(装饰器?) 133 5.10.1. 把函数作为参数,传递给其它函数 134 5.10.2. 在其它函数中返回函数 134 5.11. 闭包 135 5.12. 头等函数的实际用途 137 6. 微服务创建 140 6.1. 使用net/http创建简单的web server 140 6.2. 读写JSON 144 6.2.1. Marshal go结构到JSON 144 6.2.2. Unmarshalling JSON 到Go结构 146 7. 方法 146 7.1. 什么是方法? 146 7.2. 方法示例 146 7.3. 函数和方法区别 148 7.4. 指针接收器与值接收器 153 7.5. 那么什么时候使用指针接收器,什么时候使用值接收器? 155 7.6. 匿名字段的方法 156 7.7. 在方法中使用值接收器 与 在函数中使用值参数 157 7.8. 在方法中使用指针接收器 与 在函数中使用指针参数 159 7.9. 在非结构体上的方法 161 8. 并发入门 162 8.1. 并发是什么? 162 8.2. 并行是什么? 162 8.3. 从技术上看并发和并行 163 8.4. Go 对并发的支持 164 9. Go 协程 164 9.1. Go 协程是什么? 164 9.2. Go 协程相比于线程的优势 164 9.3. 如何启动一个 Go 协程? 165 9.4. 启动多个 Go 协程 167 10. 信道channel 169 10.1. 什么是信道? 169 10.2. 信道的声明 169 10.3. 通过信道进行发送和接收 169 10.4. 发送与接收默认是阻塞的 170 10.5. 信道的代码示例 170 10.6. 信道的另一个示例 173 10.7. 死锁 174 10.8. 单向信道 175 10.9. 关闭信道和使用 for range 遍历信道 176 11. 缓冲信道和工作池(Buffered Channels and Worker Pools) 179 11.1. 什么是缓冲信道? 179 11.2. 死锁 182 11.3. 长度 vs 容量 183 11.4. WaitGroup 184 11.5. 工作池的实现 186 12. Select 188 12.1. 什么是 select? 188 12.2. 示例 189 12.3. select 的应用 190 12.4. 默认情况 190 12.5. 死锁与默认情况 191 12.6. 随机选取 191 12.7. 这下我懂了:空 select 191 13. 文件读写 191 13.1. GoLang几种读文件方式的比较 197 14. 个人 197 14.1. ++,-- 198 14.2. 逗号 198 14.3. 未使用的变量 199 14.4. Effective go 199 14.4.1. 指针 vs. 值 199 14.5. 可寻址性-map和slice的区别 201 14.5.1. slice 201 14.5.2. map 202 14.6. golang库 203 14.6.1. unicode/utf8包 203 14.6.2. time包 205 14.6.3. Strings包 205 14.6.4. 输入输出 212 14.6.5. 正则处理 224 14.6.6. Golang内建函数 226
下载时请看下面说明,对写一个动态的内存池很有帮助。 这是一个用C++语言链表的方法实现的一个静态内存池代源码。原理就是先向系统申请一块大内存,然后把这一大块分隔成相等的很多小块,然后在这这些小块的首地址部份放一个结构体结构体中有一个值是用来标明这一小块是否使用中。在这里存放你要放存的数据就是用结构体首地址加结构体自身长度就得到要放数据的首地址了.具体看代码的实现吧。我说一下动态内存池的写法。那是我给公司写的就不能上传了。结构体和静态内存池的这个差不多一样,只是增加了一个成员用来记录每一节点到大块内存的首地址在到本节点的一个尺寸长度值,做法也是先申请一块大内存。我先从释放说起吧,释放本节点时看自己的相邻节点是不是有释放掉的,如果有则合并掉他们成为一个块,如果碰到相邻的节点是另外的一个大块的话就不用合并了,原因他和自己所在的这一个大块内存上物理地址不是连续,这里一定要记住,释放过程算法怎么去写就看你的了。下面是分配写法要考虑的。在分配一小块内存给高层使用时,如果是分配在尾节点去分配的情况,那好办啊,尾节点如果不够分配了就直接从系统去申请一块大内存,节点连起来在分配,这里有可能会浪费掉一小块以结构体大小的一块内存,如果够分配就直接分配了。如果是在中间节点去分配,这里就要将释放时合并的如果大于现在要分配的就拆开来用,如果拆开剩余的那一部份只有结构体大小就不用在拆开了。这些都是要考虑的东西,优化加快速度就看你自己了.可能看时不些不明白,看静态内存的写法后你就明白了.有时我也要下载其他人共享的东西,所以就一分吧.哈哈~~~~

69,373

社区成员

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

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