我们知道,定义变量的时候,良好的习惯是,需要给变量赋一个初值,否则该变量的初值将不可预测。这一规律,对于字符数组也同样适用,不良代码示例如下:

char a[8];

在定义字符数组时,一般要对该数组进行置零操作,在大量的工程实例种,我看到比较多的是以下两种:

char b[8] = "";
char c[8] = {0};

对于以上三种写法,怀着一点好奇与探索的心态在linux及windows系统上进行了小心求证:
linux系统如下

/* array init test for linux */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
	int i = 0;
	char a[8];
	char b[8] = "";
	char c[8] = {0};

	for(i = 0; i < 8; i++)
	{
		printf("a[%i] = %x\n", i, a[i]);
		printf("b[%i] = %x\n", i, b[i]);
		printf("c[%i] = %x\n", i, c[i]);
	}

	return 0;
}

打印结果

[root@localhost array]# gcc array.c -o array
[root@localhost array]# ./array
a[0] = 70
b[0] = 0
c[0] = 0
a[1] = 4d
b[1] = 0
c[1] = 0
a[2] = ffffffa4
b[2] = 0
c[2] = 0
a[3] = 26
b[3] = 0
c[3] = 0
a[4] = fffffffd
b[4] = 0
c[4] = 0
a[5] = 7f
b[5] = 0
c[5] = 0
a[6] = 0
b[6] = 0
c[6] = 0
a[7] = 0
b[7] = 0
c[7] = 0

可以发现,字符数组 a 的值随机,不可预测,而两种置零方法都发挥了效力。在不同系统平台上也是一样的吗?于是我又在windows平台上进行了求证,这里我采用自己习惯的 libwindows/cvi作为测试平台。
测试代码完全一样,但编译时,平台对于printf(“a[%i] = %x\n”, i, a[i]);报 Warning: Local ‘a’ has not been initialized.提示 数组 a 没有被初始化并且不予运行该语句,于是只好借助平台调试窗口打断点来看 a 数组值
在这里插入图片描述
顺带着把 b、c 数组的也看了吧
在这里插入图片描述在这里插入图片描述

可以看到,在windows中

char b[8] = ""; 

这种置零方法没有达到预期的目的!

故推荐采用

char c[8] = {0};

这种置零方法来进行代码编写。
抛砖引玉,欢迎讨论。

Logo

更多推荐