《从缺陷中学习C/C++》——6.3 数组传参时的sizeof-程序员宅基地

技术标签: c/c++  

本节书摘来自异步社区出版社《从缺陷中学习C/C++》一书中的第6章,第6.3节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.3 数组传参时的sizeof

从缺陷中学习C/C++
代码示例

void copy(int a[], int b[]) {
  memcpy(b, a, sizeof(a));
}

现象&结果
copy函数执行后,内存中的内容与设想不符,目标数组b中的内容不完整,没有把源数组a中的内容全部复制过来。

Bug分析
memcpy函数的原型是void memcpy(void dest, const void *src, size_t n);,它的功能是从源src所指的内存地址的起始位置开始复制n个字节到目标dest所指的内存地址的起始位置中。上述程序中,copy函数的两个形参是数组a和数组b,函数体中调用了memcpy函数,并且为memcpy函数的第三个参数赋值sizeof(a)。程序的本意是期望sizeof(a)返回数组a所占的字节数,通过memcpy函数,把源数组a中的内容全部复制到目标数组b中。但是数组int a[]作为copy函数的形参,在copy函数体内将退化成指针,所以,sizeof(a)返回的是指针的字节数,而不是数组a的字节数。因此,数组b中只是部分复制了数组a中的内容。解决办法是:在copy函数中增加一个参数,作为数组复制的字节数。

正确代码

void copy(int a[], int b[], int len) {
  memcpy(a, b, sizeof(int)*len);
}
void del(int a[], int len) {
  memset(a, 0, sizeof(int)*len);
}

或者用数组的引用方式传参:

void copy(int a[], int (&b)[]) {
  memcpy(a, b, sizeof(b));
}

编程建议
数组传递参数时,连同数组长度一起传入是一个好方法。或者用std::vector代替数组可以避免不必要的麻烦。使用数组的引用,作为函数的参数,也可以解决上面的问题。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34242331/article/details/90557962

智能推荐

NBA2K22 李景亮面补-程序员宅基地

文章浏览阅读202次。NBA2K22 李景亮面补。

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 解决方法_settingwithcopywarning: a value is trying to be se-程序员宅基地

文章浏览阅读2.5w次,点赞33次,收藏29次。1、首先展示下遇到的问题截图2、然后跟着这个错误的报错信息,点开下面链接有兴趣研究可以点开https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy蹩脚英语看半天没看明白,转战为自己研究3、简单代码复现问题~~~df = pd.DataFrame(np.random.randint(1,10,(4,5)),columns=["A._settingwithcopywarning: a value is trying to be set on a copy of a slice fro

s7-200 smart 运动控制_西门子s7-200smart脉冲输出控制伺服程序-程序员宅基地

文章浏览阅读5.7k次,点赞5次,收藏8次。需求:1-使用PLC发送脉冲控制伺服驱动器,驱动伺服电机,带动与齿轮带连接的伸缩杆定位;要求:1-位置可调;2-速度可调; 3-显示位置、速度状态;4-断电位置保持。一、资料查看1- S7-200 SMART CPU 提供了三种开环运动控制方法:运动控制向导,PTO(脉冲串输出)及PWM(脉宽调制);通过PROFINET连接V90实现基本定位控制从STEP 7-Micro/WIN SMART V2.4 和 S7-200 SMART PLC固件版本 V2.4开始增加了 PROFINET通..._西门子s7-200smart脉冲输出控制伺服程序

关于印发《测绘地理信息质量管理办法》的通知-程序员宅基地

文章浏览阅读1k次。关于印发《测绘地理信息质量管理办法》的通知来源: 国家测绘地理信息局国土测绘司 时间:2015-07-02 14:59:41 【大 中 小】国测国发〔2015〕17号各省、自治区、直辖市、计划单列市测绘地理信息行政主管部门,新疆生产建设兵团测绘地理信息主管部门:《测绘地理信息质量管理办法》已经国家测绘地理信息局局务会议审议通过,现予印发,请认真贯彻执行。经商国家质量监督检验检疫总局同意,1997_测绘地理信息质量管理办法

只需十四步:从零开始掌握Python机器学习(附资源)_python机器学习赵涓涓-程序员宅基地

文章浏览阅读211次。Python 可以说是现在最流行的机器学习语言,而且你也能在网上找到大量的资源。你现在也在考虑从 Python 入门机器学习吗?本教程或许能帮你成功上手,从 0 到 1 掌握 Python 机器学习,至于后面再从 1 到 100 变成机器学习专家,就要看你自己的努力了。本教程原文分为两个部分,机器之心在本文中将其进行了整合,原文可参阅:suo.im/KUWgl 和 suo.im/96wD3。本教程..._python机器学习赵涓涓

实时增量备份工具(rsync –daemon + inotify tools)-程序员宅基地

文章浏览阅读713次,点赞15次,收藏9次。实时增量备份工具(rsync –daemon + inotify tools)

随便推点

Trex--高性能压测的dream tools-程序员宅基地

文章浏览阅读1.8k次。Trex 数据面基于DPDK实现,通过json-rpc的方式对外暴露控制接口,client端支持CLI/PYTHON SDK/Gui三种方式,对程序员而言,python sdk肯定是首选,基于python sdk,包个自动化压测工具,自动为每个版本提供各种场景的性能测试数据还是挺爽的。“简单的有状态”,比如对同个五元组,先通过SYN报文建连接,再持续打一段时间的ACK报文,最终发RST/SYN报文,trex的stream间可以有先后依赖关系,通过多条stream即可支持。领取,关注我持续更新哦!_trex

数据结构初阶——环形链表-程序员宅基地

文章浏览阅读480次。哈哈哈~~其实也就是带环的链表啦~~或者是这样:因此,环形链表有个特性,就是没有 tail,指针一旦进入环形部分,就是死循环,永远走不出来。_环形链表

信用卡新颖的攻击方式,黑客可非接触式卡进行交易-程序员宅基地

文章浏览阅读172次。网络安全研究人员披露了一种新颖的攻击方式,它可能使黑客欺骗销售点终端以使其与受害者的万事达卡非接触式卡进行交易,同时认为该卡是Visa卡。该研究报告是由国内知名网络安全组织东方联盟研究人员发表的,该研究报告是建立在去年9月进行的一项详细研究的基础上的,该研究涉及PIN旁路攻击,使不良行为者可以利用受害者的被盗或丢失的启用Visa EMV的信用卡来制造高价值在不知道卡PIN的情况下进行购买,甚至欺骗终端接受未经认证的离线卡交易。研究人员表示:“黑客可以将其与先前对Visa的攻击结合使用,从而绕过万

Java设计模式之行为型:状态模式_java中状态设计模式案例-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏29次。在介绍状态模式之前,我们先来看这样一个实例:你公司力排万难终于获得某个酒店的系统开发项目,并且最终落到了你的头上。下图是他们系统的主要工作(够简单)。当你第一眼看到这个系统的时候你就看出来了这是一个状态图,每个框框都代表了房间的状态,箭头表示房间状态的转换。分析如下:房间有三个状态:空闲、已预订、已入住,状态与状态之间可以根据客户的动作来进行转换。定义每个状态的值。 publ..._java中状态设计模式案例

JavaScript — 原生js实现上传图片控件_js利用class实现上传图片组件-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏15次。一、修改原生 input 样式html 结构<div class="card"> <input id="upload" type="file" accept=".jpg" /> <div class="view"> <!-- 上传成功后 --> <div id="imgContainer" class="img-container"> <img id="img" /&_js利用class实现上传图片组件

是德科技KEYSIGHT E4980A精密性LCR测试仪_keysight 4070电容测试精度-程序员宅基地

文章浏览阅读370次,点赞10次,收藏9次。此外,它还具有多种测量模式,可以根据不同的测试需求进行灵活的配置和使用。此外,它还具有很高的测量速度和采样率,可以在短时间内完成大量的测试和数据采集。它具有高精度、高稳定性和高分辨率的测量特点,可以满足各种电子元件和材料的分析和测试需求。此外,它还具有自动校准和校准验证功能,可以保证测量的准确性和可靠性。此外,它还具有自动校准和校准验证功能,可以保证测量的准确性和可靠性。它是一款四端仪器,可以测量电阻、电容和电感等元件的阻抗、相位和品质因数等参数,适用于各种电子元件和材料的分析和测试。_keysight 4070电容测试精度