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/

欢迎讨论和交流!


memset初始化数组的坑的更多相关文章

  1. memset初始化数组的问题

    今天才搞清楚,memset用于初始化数组,仅能初始化为0值,而不能初始化一个特定的值,这怎么能模糊了呢??? 因此,如果对申请的一段存放数组的内存进行初始化,每个数组元素均初始化为特定的值,必须使用循 ...

  2. memset 初始化数组 & 实现原理

    初始化数组可不必使用n重for循环. 原理 memset具有初始化数组的功能,能够初始化数组中的每一个值. 它是将数组中的每一个数的二进制的每一个字节初始化的. 比如初始化int类型的a数组:mems ...

  3. memset 初始化数组

    memset是初始化一段内存区域的函数,其头文件是<string.h>,以前经常使用出现错误,整理一下. C++ Reference对于memset的定义为: void * memset ...

  4. 批量初始化数组和memset函数

    对于数组的初始化有一下三种方式: int  a[]={1,2,3,4,5} //通过判断初始化值得个数来却仍数组长度 int b[5]={1,2,3} //数组长度为5,可是初始值却只有三个,因此,不 ...

  5. c++ 批量初始化数组 fill和fill_n函数的应用

    转自c++ 如何批量初始化数组 fill和fill_n函数的应用 std::fill(a+,a+,0x3f3f3f3f);///从下标2到下标10 前闭后开 共8个 std::fill_n(a+,,0 ...

  6. c#清空数组&初始化数组&动态数组

    清空数组>>>Array.Clear [去MSDN查看] ]; ; i < str.Length; i++) str[i] = i.ToString(); Array.Clea ...

  7. PHP5.2 $arr = [] 初始化数组出现问题

    初始化数组  $arr=[] ,出现问题,使用 $arr = array() ,一切正常

  8. Java自学-数组 初始化数组

    Java 如何初始化数组 步骤 1 : 分配空间与赋值分步进行 public class HelloWorld { public static void main(String[] args) { i ...

  9. 使用memset初始化int数组

    memset()是一个来自于string库的函数,正规用法是初始化char类型的数组.因为char类型只占1个字节,memset按字节赋值后,会将char类型数组的所有元素变为你指定的值.但是4字节的 ...

随机推荐

  1. CentOS7怎么安装图形界面

    step1: 进入下载页,选择阿里云站点进行下载 Actual  Country 国内资源                   Nearby Countries  周边国家资源 阿里云站点:http: ...

  2. 【计算机视觉】Histogram of Oriented Gridients(HOG) 方向梯度直方图

    Histogram of Oriented Gridients(HOG) 方向梯度直方图 Histogram of Oriented Gridients,缩写为HOG,是目前计算机视觉.模式识别领域很 ...

  3. C学习笔记-运算符

    一些基本概念 数据对象:泛指数据在内存的存储区域 左值:表示可以被更改的数据对象 右值:能赋给左值的量 算数运算符 运算符 描述 实例 + 把两个操作数相加 a + b - 从第一个操作数中减去第二个 ...

  4. getopts的使用 + 创建空目录

    1.getopts的经典例子 isRollback= rollbackVer="" targetGroup="" actionType="" ...

  5. Comparator接口实现排序

    对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法或者Arrays.sort方法排序.实现int compare(T o1, T o2);方法,返回正数,零 ...

  6. TestNG使用教程详解(接口测试用例编写与断言)

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

  7. java23种设计模式之四:建造者模式

    在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成.例如:在新招收一个员工时,对个人信息对象的创建,在不同的阶段,需要个人信息的内容也不一样,姓名.性别.年龄 ...

  8. Linux软链接的创建,删除,修改

    Linux软链接,类似于windows系统的快捷键.譬如你将windows系统的D盘中某一个文件夹放在桌面上当做快捷键. 一.软链接创建 1.创建软链接 ln -s [目标目录] [软链接地址] [目 ...

  9. golang 环境配置 over centos7

    基本编程环境 下载go1.8压缩包,解压后存放至目录~/work/下. 编辑~/.bashrc,添加如下三行在尾部 执行 source ~/.bashrc  配置vim + go  下载Vundle ...

  10. java 序列化和反序列化的底层实现原理

    出处:序列化和反序列化的底层实现原理是什么? 一.基本概念1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过 ...