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

本文探讨了C++中使用memset函数对数组赋值0的常见误区,特别是当数组作为函数参数传递时,如何正确地对整个数组进行初始化。通过对比main函数和初始化函数中的sizeof操作符行为,揭示了形参与实参在内存分配上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值