以下代码一定会输出ok吗?

#include

#include

struct S { int array[2]; };

int main () {

struct S a = { { 1, 2 } };

struct S b;

b = a;

if (memcmp(b.array, a.array, sizeof(b.array)) == 0) {

puts("ok");

}

return 0;

}

我在vs2005以及gcc4.4.3上做了测试,都输出了ok。但这并不意味这个代码会永远输出ok。问题主要集中于这里使用了赋值语句来复制值,但却使用了memcmp这个基于内存数据比较的函数来比较值。

c语言中的赋值运算符(=)被定义为基于值的复制,而不是基于内存内容的复制。

C99 section 6.5.16.1 p2: In simple assignment (=), the value of the right operand is converted to the type of the assignment expression and replaces the value stored in the object designated by the left operand.

这个其实很好理解,尤其在不同类型的数字类型间复制时,例如:

float a = 1.1;

int b = a;

因为浮点数和整形数的内存布局不一样,所以肯定是基于值的一种复制。另外,按照语言标准的思路来看,内存布局这种东西一般都属于实现相关的,所以语言标准是不会依赖实现去定义语言的。

上面的定理同样用于复杂数据类型,例如结构体。我们都知道结构体每个成员之间可能会有字节补齐,而使用赋值运算符来复制时,会不会复制这些补齐字节的内容,是语言标准未规定的。这意味着使用memcmp比较两个通过赋值运算符复制的两个结构体时,其结果是未定的。

但是上面的代码例子中,比较的其实是两个int数组。这也无法确认结果吗?这个问题最终集中于,难道int也会有不确定的补齐字节数据?

C99 6.2.6.2 integer types For signed integer types, the bits of the object representation shall be divided into three groups: value bits, padding bits, and the sign bit. […] The values of any padding bits are unspecified.

这话其实我也不太懂。一个有符号整数int,其内也有补齐二进制位(bits)?

但无论如何,这个例子都不算严谨的代码。人们的建议是使用memcpy来复制这种数据,因为memcpy和memcmp都是基于内存内容来工作的。

C语言数组比较相等memcmp,使用memcmp比较两个变量结果一定吗?相关推荐

  1. C语言数组测试函数,(完整word版)C语言数组与函数阶段测试题答案---(20200807070313)(8页)-原创力文档...

    } } C语言数组与函数阶段测试题答案 一.选择题( 18*2=36 分) 1. 在定义" int a[5][6]; "后,第 11个元素是 [ C ] A.a[2][5] B . ...

  2. c语言数组中的字母可以相等吗,C语言数组比较

    C语言数组比较教程 在 要比较两个 C 语言的数组是否相等,我们只有使用 案例 比较两个数组是否相等 通过循环遍历数组来比较数组 #include int main(){ printf("嗨 ...

  3. C语言数组知识体系整理大学霸IT达人

    C语言数组知识体系整理大学霸IT达人 数组是一组连续存储空间可以存放特定类型的对象.存放的对象被称为元素.数组的元素可以通过下标运算符和指针进行访问以及存取.对于数组的内容我们需要掌握数组的定义,数组 ...

  4. java数组是行优先还是列优先的语言_详解C语言数组中是以列优先吗

    如果我们按照C语言的方式存储它,也就是行优先存储的话,那么在内存中,它的形状是这样的: 这种存储方式又被称作C contiguous array. C语言数组结构列优先顺序存储的实现 (GCC编译). ...

  5. c语言数组最大元调换,c语言数组元素交换有关问题,请高手过来看看

    c语言数组元素交换问题,请高手过来看看 主要问题是数组元素交换不正确,以下是代码: #include #include #define PI 3.1415926 #define MAX 512 dou ...

  6. go语言查询某个值是否在数组中_Go语言数组详解

    数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成.因为数组的长度是固定的,所以在Go语言中很少直接使用数组. 和数组对应的类型是 Slice(切片),Slice 是可以增 ...

  7. C语言数组学习 - 使用窗口版程序演示

    C数组基本: 使用数组输出 4*4 矩阵: 二维数组: /*------------------------------------------------- bobo, 2020 --------- ...

  8. Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)

    Algorithm:C+语言实现之数组相关算法(和为定值的两个数.和为定值的m个数.荷兰国旗.长度为2n的洗牌算法.任意长度数组的洗牌算法) 目录 数组 1.寻找和为定值的两个数 2.和为定值的m个数 ...

  9. python调用golang 数组_Go 语言数组复制

    Go 语言数组复制 Golang编程语言中的数组与其他编程语言非常相似.在程序中,有时我们需要存储一组相同类型的数据,例如学生评分列表.这种类型的集合使用数组存储在程序中.数组是固定长度的序列,用于将 ...

  10. c语言数组与指针浅析

    大部分人,特别是初学者对于一些奇怪的数组表达式表示诧异. 举个例子: #include<stdio.h> int main(void) { int a[3]; for(int i = 0; ...

最新文章

  1. kettle大数据量读写mysql性能优化
  2. shell编程系列26--大型脚本工具开发实战
  3. 电机编码器调零步骤_编码器原理、霍尔应用原理、调整步骤三个方面进行解读编码器调试...
  4. java参数化查询_小博老师解析Java核心技术 ——JDBC参数化查询(二)
  5. 怎么获取求生之路服务器信息失败,新人服务器出现问题 求助求助!!!!!...
  6. 草莓派Raspberry3B
  7. 萌新首发,C/C++(通讯录管理系统)希望大家多多关注、点赞
  8. android+判断wifi+5g,Android判断wifi是5G还是2.4G
  9. 云服务器修改密码无法登录,云服务器修改登录密码
  10. C#语言入门详解1-12
  11. 《重构:改善既有代码的设计》读书笔记(上)
  12. MySQL删除行之后空间没有被释放
  13. 幂级数和函数经典例题_10函数项级数和幂级数 习题课
  14. Photoshop插件-charIDToTypeID-PIStringTerminology.h-不同值的解释及参考-脚本开发-PS插件
  15. Spring-Boot启动方式,以及线上部署
  16. android 自定义 对号,Android 自定义View 对勾CheckBox
  17. matlab中电流表在哪儿,电流表的符号
  18. 全文检索技术Lucene入门和学习、与数据库数据结合的demo实现
  19. Elasticsearch[学习笔记]
  20. Kali [dnsenum]子域名查询工具

热门文章

  1. 翟菜花:她经济的营销攻坚战,4C的用户导向才是破局之法
  2. 汤晓鸥教授:人工智能让天下没有难吹的牛!
  3. python使用docx模块读写docx文件的方法与docx模块常用方法详解
  4. 厦门大学电子科学系夏令营
  5. Airtest 之 poco 避坑大法
  6. c++语言设计五子棋游戏,C++实现五子棋游戏
  7. 北航2021年复试机试第二题
  8. 如何对极乐迪斯科(Disco Elysium for mac)进行安装
  9. 2021年西式面点师(中级)报名考试及西式面点师(中级)证考试
  10. 市面上的手机银行的简介