2010-11-08 94 views
0

我为什么能做到字符数组声明的问题

char identifier[4] = {'A', 'B', 'C', 'D'}; 

,而不是

char identifier[4]; 
&identifier = {'A', 'B', 'C', 'D'}; // syntax error : '{' 

,为什么我能做到

char identifier[4] = "ABCD"; // ABCD\0, aren't that 5 characters?? 

,而不是

char identifier[4]; 
&identifier = "ABCD"; // 'char (*)[4]' differs in levels of indirection from 'char [5]' 

这是个玩笑吗?

+2

如果您需要将声明与作业分开,您可以随时执行此操作:'char identifier [4]; sprintf(标识符,“ABCD”);'。只要确保分配的字符串符合分配的数组或使用安全版本['sprintf_s'](http://msdn.microsoft.com/zh-cn/library/ce3zzk1k%28v=VS.100%29)。 ASPX)。 – 2010-11-08 19:25:56

+0

好的谢谢!这有效,但为什么我需要一个像这样简单的功能...... – Midas 2010-11-08 19:30:06

+1

@Jaime:你不觉得sprintf()在这种情况下可能是一个攻击坚果的大锤吗? memcpy()将足以*和*解决您为sprintf_s()提出的问题。 – Clifford 2010-11-08 22:18:36

回答

2

三点:

  • 初始化不分配

  • 数组没有一流的类型,因此不能进行分配。你必须分配单独的元件(或使用函数如的strcpy()或的memcpy()。

  • 数组的地址是由阵列名称设置在其自己的。

在你的最后一个例子,下面是一个有效的解决方案:

char identifier[4]; 
memcpy(identifier, "ABCD", sizeof(identifier)) ; 

不能使用的strcpy()在这里,因为这将需要5个字符数组允许NUL终止的错误信息有关的间接的水平是不是一个“玩笑”,它是你的错误;上述代码中的注释identifier没有&运算符,因为这会使其成为char**,其中char*是必需的。

+0

+1 +1 +1 +1 +1 +1 +1 +1,但我会详细说明一下“初始化不分配”意味着新手。 – 2010-11-08 19:38:56

+0

@Clifford,'数组的地址由数组名称自己提供'是误导性的,并教导错误的东西。我会去做类似于'通过自己的评估来使用数组名称到第一个元素的地址'的东西。 – 2010-11-08 21:29:50

+0

@Jens:也许,我会让它站立起来,因为我认为它很清楚。我明显没有说数组名*是一个指针。您的评论可能会对任何认为有必要的人作出澄清。我试图简洁。 – Clifford 2010-11-08 22:12:59

3

您只能在声明它时初始化数组。

至于char identifier[4] = "ABCD",这确实是可能的,但是语法被用来故意忽略尾随的NUL字符。执行char identifier[] = "ABCD"以让编译器计算字符并为您添加NUL()。

+0

在第二个代码中,'&identifier'是一个指向数组的指针。 – 2010-11-08 19:17:58

+0

是的,我只是假设'&'语法是OP试图发明一些做不到的事情。 – Arkku 2010-11-08 19:44:25

2

什么Arkku说,而且,你不能指定的东西的地址,即&x = ...是从来没有合法的。