memset初始化数组的坑

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初始化数组的坑

原文地址:https://www.cnblogs.com/chouxianyu/p/11322984.html

时间: 2024-11-02 02:50:41

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

memset 初始化数组 &amp; 实现原理

初始化数组可不必使用n重for循环. 原理 memset具有初始化数组的功能,能够初始化数组中的每一个值. 它是将数组中的每一个数的二进制的每一个字节初始化的. 比如初始化int类型的a数组:memset(a,1,sizeof(a)); 得到的其实是0001 0001 0001 0001. 关于0x......不懂的:我的博客 代码 #include<cstring>如果是int数组: memset(g, 0, sizeof(g));                   //全部清为0: me

memset 初始化数组

memset是初始化一段内存区域的函数,其头文件是<string.h>,以前经常使用出现错误,整理一下. C++ Reference对于memset的定义为: void * memset ( void * ptr, int value, size_t num ); 其中,对于memset的各个参数的定义如下: ptr: Pointer to the block of memory to fill. value: Value to be set. The value is passed as a

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

转自c++ 如何批量初始化数组 fill和fill_n函数的应用 std::fill(a+2,a+10,0x3f3f3f3f);///从下标2到下标10 前闭后开 共8个 std::fill_n(a+2,10,0x3f3f3f3f);///从下标2 开始 填充10个 memset(a,0x7f7f7f7f,sizeof(a)); 一. fill和fill_n函数的应用: fill函数的作用是:将一个区间的元素都赋予val值. 函数参数:fill(first,last,val);//first为容

【转】c++ 如何批量初始化数组 fill和fill_n函数的应用

http://blog.csdn.net/sunquana/article/details/9153213 一. fill和fill_n函数的应用: fill函数的作用是:将一个区间的元素都赋予val值. 函数参数:fill(first,last,val);//first为容器的首迭代器,last为容器的尾迭代器, 替换元素的区间为[first,last),val为将要替换的值. eg:             vector <int> V;             fill(V.begin(

【转】c++中使用memset初始化类对象

https://blog.csdn.net/u010261063/article/details/70064090 1 #include <iostream> 2 #include <memory.h> 3 using namespace std; 4 5 class parent{ 6 public: 7 virtual void output(); 8 virtual void output2(); 9 }; 10 11 void parent::output(){ 12 co

C语言:实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置

#include<stdio.h> void init(int arr[],int len) {  int i=0;  printf("初始化数组->:\n");  for(i=0;i<len;i++)  {    scanf("%d",&arr[i]);   }  } void reverse(int arr[],int len) {  int i=0;  printf("逆置数组->:\n");  for

创建一个数组, 实现初始化数组、清空数组、完成数组元素的逆置。

#include <stdio.h> void init(int arr[],int len) { int i=0; int num=0; printf("初始化数组->:\n"); for(i=0;i<len;i++) { scanf("%d",&num); arr[i]=num; } } void empty(int arr[],int len) { int i=0; printf("清空数组->:\n"

c#清空数组&amp;初始化数组&amp;动态数组

清空数组>>>Array.Clear [去MSDN查看] 1 string[] str = new string[2]; 2 for (int i = 0; i < str.Length; i++) 3 str[i] = i.ToString(); 4 Array.Clear(str, 0, str.Length); 5 for (int i = 0; i < str.Length; i++) 6 Console.WriteLine(string.IsNullOrEmpty(

用enum枚举量做下标初始化数组

一下copy自:http://bbs.csdn.net/topics/90234659 ------------------------------------------------------------------------------------------------------------------- “两则C语言技巧”http://tb.blog.csdn.net/TrackBack.aspx?PostId=1120124第一个技巧在我的环境下不能通过,是我的原因吗.引用:1.