【问题标题】:Char array declaring problemsChar 数组声明问题
【发布时间】:2010-11-08 19:11:12
【问题描述】:

为什么我可以这样做

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]'

?

这是在开玩笑吗??

【问题讨论】:

  • 如果您需要将声明与赋值分开,您始终可以这样做:char identifier[4]; sprintf(identifier, "ABCD");。只需确保分配的字符串适合分配的数组或使用安全版本,sprintf_s
  • 好的,谢谢!这行得通,但为什么我需要一个像这样简单的函数......
  • @Jaime:在这种情况下,您不认为 sprintf() 可能是一把大锤吗? memcpy() 就足够了 并且 解决了您提出 sprintf_s() 的问题。
  • @Midas:因为数组不是 C 中的数据类型,所以它是同一类型的对象的连续序列。数组的行为不像对象。
  • @Midas:克利福德是正确的。您不需要在sprintf 中使用字符串格式修饰符。你应该使用char identifier[4]; memcpy(identifier, "ABCD", 4)

标签: c arrays char


【解决方案1】:

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

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

【讨论】:

  • 另外,在第二个代码中,&identifier 是一个指向数组的指针。
  • 是的,我只是假设 & 语法是 OP 试图发明的东西,用于做一些不可能的事情。
【解决方案2】:

三点:

  • 初始化不是赋值

  • 数组不是一等类型,因此无法赋值。您必须单独分配元素(或使用 strcpy() 或 memcpy() 等函数。

  • 数组的地址由数组名自己提供。

在您的最后一个示例中,以下是一个有效的解决方案:

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

您不能在此处使用 strcpy(),因为这需要一个包含 5 个字符的数组才能允许使用 nul 终止符。关于间接级别的错误消息不是“笑话”,而是 your 错误;请注意,上述代码中的 identifier 没有 & 运算符,因为这将使其成为需要 char*char**

【讨论】:

  • +1 +1 +1 +1 +1 +1 +1 +1 但我会详细说明“初始化不是赋值”对新手的意义。
  • @Clifford, the address of an array is provided by the array name on its own 具有误导性并教导错误的东西。我会选择using the array name by its own evaluates to the address of the first element
  • @Jens:也许吧,我认为它已经足够清楚了。我显然没有说过数组名 is 是一个指针。您的评论可以向任何认为有必要的人澄清。我试图简洁。
  • identifier 上使用& 运算符不会使其成为char **,而是使其成为char (*)[4](正如编译器的错误消息所证明的那样)。这些是完全不同的类型。
  • @caf:我知道。然而 memcpy() 收到的是char*。这就是我所说的“需要char*”的意思; memcpy() 需要一个'char*'。虽然我同意你的看法,但在这种情况下,区别是无关紧要的,所以我从来没有提到它——为了简洁起见。
【解决方案3】:

Arkku 所说的,而且,你不能分配给某物的地址,即&x = ... 是不合法的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多