C/C++初始化字符数组的方式对比,{0}是否存在问题?

本文分析了C/C++中初始化字符数组的两种常见方式,即直接赋值为0和使用memset函数。从汇编层面来看,两者最终都会调用memset进行清零操作,因此在安全性上没有明显差异。虽然第一种方式在某些情况下可能不会调用memset,但两种方式都可以确保所有空间被清零。作者推荐使用第一种方式,认为其更优雅,但可读性稍差。

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

前言:

一般我们在C/C++中有两种常见的初始化字符数组的方式,如下:

//第一种
char szBuff[64] = {0};

//第二种
char szBuff[64];
memset(szBuff,0,sizeof(szBuff));

那么这两种谁更优?谁更安全?一般稳健一点的人可能会选择使用后者,毕竟自己memset了,有的人可能认为第一种方式只是将第一个字符置空,而其他位置并未初始化,这样写效率高。其实并非如此,让我们从汇编层面来分析一下。

分析过程:

第一种:

char szBuff[64] = {0};

对应的汇编代码如下:

00191013  mov         byte ptr [ebp-48h],0  
00191017  push        3Fh  
00191019  push        0  
0019101B  lea         eax,[ebp-47h]  
0019101E  push        eax  
0019101F  call        memset (191854h)  
00191024  add         esp,0Ch 

第二种:

char szBuff[64];
memset(szBuff,0,sizeof(szBuff));

对应的汇编代码如下:

00191027  push        40h  
00191029  push        0  
0019102B  lea         ecx,[ebp-88h]  
00191031  push        ecx  
00191032  call        memset (191854h)  
00191037  add         esp,0Ch  

结论:

其实本质上而言,两种方式最终都是通过调用memset来实现清0的,只是细微上有点点差别(当然如果字符数组很短的话,第一种方式并不一定会调用memset,而是采用多个mov来清零),总之两种方式都保证了所有的空间全部被清零了

两种方式都可以放心使用,完全看个人喜好,但本人推荐第一种方式,优雅,但个人认为可读性稍差,菜鸟看到了未必理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇龍_

若帮助到你,希望能给予鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值