用C初始化一个char数组哪种方式更好?

问题描述:

以下是初始化字符数组的方法有两种:用C初始化一个char数组哪种方式更好?

char charArray1[] = "foo"; 
char charArray2[] = {'f','o','o','\0'}; 

如果两个是等价的,人们期待大家使用上面的第一个选项(因为它需要较少的击键)。但是我看过代码,作者总是使用第二种方法。

我的猜测是,在第一种情况下,字符串“foo”存储在数据段中并在运行时拷贝到数组中,而在第二种情况下,字符存储在代码段中并复制到数组中运行。出于某种原因,作者对数据段中的任何内容过敏。

编辑:假定数组声明为函数本地。

问题:我的推理是否正确?你喜欢哪种风格?为什么?

+0

第一种风格 - 绝对。更清晰,更简洁。与可读性好处相比,1和2之间的perf影响可忽略不计。 – obelix 2010-08-15 11:35:18

+3

相关:http://*.com/questions/3427750/difference-between-array-initializations和http://*.com/questions/3429071/string-initializer-and-read-only-section – 2010-08-15 11:37:23

+0

@Prasoon谢谢为链接。我发布前搜索和搜索,但没有找到它。编译器“不支持第一种方法”的 – 2010-08-15 11:46:51

什么另一种可能性:

char charArray3[] = {102, 111, 111, 0}; 

你不应该忘记C字符类型是一个数字类型,它恰好发生该值通常用作字符代码。但是如果我使用数组来处理与文本无关的东西,那么我肯定会更喜欢用上面的语法对它进行初始化,而不是将它编码为字母并放在引号之间。

如果您不希望终端0您还可以使用在C使用第二种形式或:

char charArray3[3] = "foo"; 

这是一个几乎没有人知道AAÇ功能,但如果编译器没有当初始化一个charArray时,它足以容纳最终的0,但它没有放置它,但代码是合法的。但是,应该避免这种情况,因为此功能已从C++中删除,并且C++编译器会产生错误。

我检查了由gcc生成的汇编代码,并且所有不同的表单都是等效的。唯一的区别是它使用.string或.byte伪指令来声明数据。但这只是一个可读性问题,并没有在最终的程序中有所改变。

我认为第二种方法主要用于遗留代码,其中编译器不支持第一种方法。这两种方法都应该将数据存储在数据段中。由于可读性,我更喜欢第一种方法。另外,我需要修补一次程序(不记得是哪一个,它是一个标准的UNIX工具)不使用/ etc(它是用于嵌入式系统)。我有一个非常艰难的时间找到正确的地方,因为他们用的是第二种方法和我的grep找不到“等”任何地方:-)

+1

?它严格的C89,每个ANSI编译器都应该支持这一点。 – user411313 2010-08-15 11:59:06

+0

这很好,如果你持有你的char数组来保存一些文本,如果你想存储数字'“\ x66 \ x6f \ x6f”'肯定比'{102,111,111,0}'更不可读(甚至有以十六进制或十进制转换,因为您不能使用十进制键入char代码)。在某些情况下放松第二种形式将是一种真正的痛苦。 – kriss 2010-08-15 12:08:08

+0

@gordongekko:我认为K&R C有很好的方法存在问题,但是一些Google搜索似乎表明,即使K&R C也支持这两种方法...... – DarkDust 2010-08-15 12:38:45