C++中传递数组给函数形参并调用memset的一个注意事项

  • Post author:
  • Post category:其他


在C++中,如果需要对数组进行全部赋0值,一种选择是采用函数memset(void *,int,size_t)。今天在写程序的过程中遇到了一个将数组指针传递给函数形参造成无法全部赋值0的坑,特此记录一下。

代码总体来说是这样的,我把数组赋0的操作放在了一个初始化函数中,是这样形式的代码:

#include <iostream>
#include<cstring>

using namespace std;

void aInit(int *a){
    memset(a,0,sizeof(a));
    cout<<"aInit:"<<sizeof(a)<<endl;
}

int main(){
    int a[100];
    a[0]=1;
    a[1]=1;
    aInit(a);
    cout<<"a[1]="<<a[1]<<endl;
    cout<<"a[0]="<<a[0]<<endl;
    cout<<"main:"<<sizeof(a)<<endl;
    memset(a,0,sizeof(a));
    cout<<"main 中调用memset,a[1]="<<a[1]<<endl;
    return 0;

}

但是第一次输出a[1]的时候发现a[1]并没有被赋0值,仅仅是a[0]被赋0值了。于是我多打印了一些信息,发现了main函数与aInit函数的差别,在aInit中输出sizeof(a(形参))的结果是4,即一个整型变量所占的内存字节数,在aInit函数中,形参a是一个int类型的指针,指向a[0],所以输出sizeof(a(形参))输出的是a[0]所占的字节数,调用memset仅仅是将a[0]赋值为0。数组中其他元素并没有修改。而在main函数中,a是一个数组名,虽然它也是a[0]的地址,但是a代表的也是一个数组,所以sizeof(a)是数组所有元素a[0]-a[99]所占的字节数为400,调用memset后,数组的所有元素都被赋值为0。



版权声明:本文为LOVETEDA原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。