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

时间:2010-08-15 11:32:21

标签: c++ c arrays initialization

以下是初始化char数组的两种方法:

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

如果两者都是等价的,人们会希望每个人都使用上面的第一个选项(因为它需要更少的击键次数)。但是我已经看到了代码,作者总是使用第二种方法。

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

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

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

2 个答案:

答案 0 :(得分:5)

另一种可能性如何:

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

你不应该忘记C char类型是一个数字类型,它只是发生这个值经常被用作char代码。但是如果我使用一个数组来处理与文本无关的东西,我肯定会更喜欢用上面的语法初始化它,而不是将它编码成字母并将它们放在引号之间。

如果您不想要终端0,您还必须使用第二个表格或在C中使用:

char charArray3[3] = "foo";

这是一个几乎没有人知道的C功能,但是如果编译器在初始化charArray时没有足够的空间来保存最终的0,那么它不会放置它,但代码是合法的。但是应该避免这种情况,因为此功能已从C ++中删除,而C ++编译器会产生错误。

我检查了gcc生成的汇编代码,所有不同的形式都是等价的。唯一的区别是它使用.string或.byte伪指令来声明数据。但这只是一个可读性问题,并没有对结果程序产生一些影响。

答案 1 :(得分:1)

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