《从缺陷中学习C/C++》——6.3 数组传参时的sizeof

简介:

本节书摘来自异步社区出版社《从缺陷中学习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代替数组可以避免不必要的麻烦。使用数组的引用,作为函数的参数,也可以解决上面的问题。

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

相关文章
|
13天前
|
C++
c++的学习之路:27、红黑树
c++的学习之路:27、红黑树
28 4
|
13天前
|
Java C++
C++的学习之路:21、继承(2)
C++的学习之路:21、继承(2)
18 0
|
13天前
|
编译器 C语言 C++
c++的学习之路:19、模板
c++的学习之路:19、模板
32 0
|
13天前
|
设计模式 存储 Android开发
c++的学习之路:18、容器适配器与反向迭代器
c++的学习之路:18、容器适配器与反向迭代器
19 0
|
13天前
|
存储 算法 C++
c++的学习之路:17、stack、queue与priority_queue
c++的学习之路:17、stack、queue与priority_queue
30 0
|
13天前
|
存储 C++ 容器
c++的学习之路:26、AVL树
c++的学习之路:26、AVL树
26 0
|
13天前
|
编译器 C++
c++的学习之路:22、多态(1)
c++的学习之路:22、多态(1)
21 0
c++的学习之路:22、多态(1)
|
13天前
|
安全 编译器 程序员
c++的学习之路:20、继承(1)
c++的学习之路:20、继承(1)
28 0
|
6天前
|
编译器 C语言 C++
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
15 0
|
7天前
|
存储 C++
【C++模板】模板实现通用的数组
【C++模板】模板实现通用的数组