数组与字符串初始化为空的深入理解

正题

1. 一维数组初始化,可以只给一部分元素赋值,如下

int a[10] = {0,1,2,3,4};
这样只给前面的5个元素赋值,后5个元素为0。
将char p[8]; 看作是字符数组的话, charp[8]={0}; 表示第一个元素为0,后面的7个元素也为0;
所以 char p[8] = {}和charp[8]={0}一样; 8个元素都初始化为0
2.用字符串常量来使字符数组初始化
char p[10] = "china";
前5个元素为‘c’,'h','i','n','a',
第6个元素为‘\0'
后4个元素为空字符,即‘\0'
所以用char p[8] = "";初始化,8个元素都是‘\0';
//'0'表示结束标志,代表ASCII码为0的字符
所以用 char p[8] = ""; 和 char p[8] = {0}; 都能够将8个元素初始化为0;
char p[8] = {0}; 当作字符数组看待,常规数组初始化;
char p[8] = "";  用字符串常量初始化

附注

#define ARRAYSIZE 2048
voidmain() {
chararrayA[ARRAYSIZE]={0};
chararrayB[ARRAYSIZE];
memset(array,0, ARRAYSIZE);
}

char arrayA[ARRAYSIZE] = {0};
编译是先arrayA[0]赋值为0, 再调用memset初始化其他的数组元素.

char arrayA[ARRAYSIZE] = {0};
效率很难比用memset高,因为综上分析,我觉得给一块内存赋值的效率很难超越memset。

memset

语法:

#include <cstring> void * memset ( void * buffer, int ch, size_t count ) ;

memset()拷贝chbuffer的前count字符中,并返回buffer。memset()对于以某一值初始化一段内存非常有用。例如,这个命令:

const int ARRAY_LENGTH = 300 ;
char the_array [ ARRAY_LENGTH ] ;
// zero out the contents of the_array
memset ( the_array, ' \0 ' , ARRAY_LENGTH ) ;

…是非常有效率的方法来设置the_array中的所有值为零。

下表比较了两种不同的方式来初始化字符数组:for循环和memeset()。随着初始化数据量的增加,memset()很清晰的做的更快:

耗时for循环memset
10000.0160.017
100000.0550.013
1000000.4430.029
10000004.3370.291

几条不成熟的建议

1:非必要情况不对内存使用memset清零,尤其是大块内存。

2:如某结构体或内存块在使用前会逐一赋值,则不需要对其进行memset初始化。

3:字符串的初始化可以对其第一个字节赋值0。

使用strcpy拷贝的字符串不需要进行初始化。

使用strncpy拷贝的字符串,建议不要先进行memset全部清零,而是在strncpy后,根据字符串实际长度,对字符串后一个字节置零。

在做流程判断的时,尽量减少使用字符串比较,而采用整形或布尔量比较。

4:减少结构体转换和copy代码。对结构体尤其是包含长字符串的结构体复制时,建议慎用memcpy,而采取逐一赋值的方式。

5: 非必要不使用malloc和free,不但容易造成内存泄露,而且动态分配内存快时,系统的内存堆状况可能会影响分配效率(比如内存碎片很多时)。建议对一些动态分配的数组,采用定义一个足够大的数组方式.(这里有个问题:局部变量的最大尺寸是多少呢,也就是说进程栈空间是多少呢?这个应该是有限制的,但是每种操作系统或编译器的限制是多少呢,应该不能在栈空间里定义一个几十M或一个G大的数组吧?)

6:unix程序是基本上是以进程模式运行的,可以合理使用全局静态变量。减少分配内存的开销。在多线程程序里慎用全局变量




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FeelTouch Labs

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值