memset
函数常被我们用来初始化数组,然而有个坑可能会被我们踩到。
静态数组初始化
一般情形是这样的:
#include <cstring> int main() { // 静态数组arr int arr[10]; // 将数组所有元素初始化为0 memset(arr,0,sizeof(arr)); // 遍历输出数组元素 for(int i=0;i<10;++i){ cout << arr[i] << endl; } return 0; }
这样做是正确的,通过输出可以看到正确结果。
注意:这份代码中arr
是个静态数组。
动态数组初始化
#include <cstring> int main() { // 动态数组arr int* arr=new int[10]; // 将数组所有元素初始化为0 memset(arr,0,sizeof(arr)); // 遍历输出数组元素 for(int i=0;i<10;++i){ cout << arr[i] << endl; } return 0; }
这份代码运行后,我们发现memset
并没有把数组元素全部初始化为0。
注意:arr
是个动态数组
原因如下:
我们可以在上面两份代码中输出sizeof(arr)
,可以发现结果是不一样的。
因为在第一份代码中arr
代表一个数组,第二份代码中arr
代表一个指针。(关于数组名是什么这个问题可以参考我的另一篇文章:https://www.cnblogs.com/chouxianyu/p/11322951.html,其实这个问题我觉得是编译原理应该会学到的)
解决方案
初始化数组(静态动态均可)时,把代码改成memset(arr,0,sizeof(int)*10);
,int
是数组元素的类型,10
是数组元素个数。
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!