【问题标题】:C Array Size LimitC 数组大小限制
【发布时间】:2013-12-24 09:37:47
【问题描述】:

我在 Linux Redhat 上使用 gcc 编译器。我很惊讶为什么a[5]a[6](Maya 和 Mayank)的输出有 2 个字符的差异,尽管它们的大小只有 1 个字节。

char a[5]="Mayank";
char b[6]="Mayank";
char c[7]="Mayank";

printf("%s\n",a);
printf("%s\n",b);
printf("%s\n",c);

输出:

Maya
Mayank
Mayank

【问题讨论】:

标签: c arrays string


【解决方案1】:

前两个printf 调用有undefined behaviour,因为ab 都不包含终止NUL 字符(c 包含,所以最后一个printf() 本身就可以了)。

【讨论】:

  • @GrijeshChauhan:是吗? "Mayank" 中有七个字符,算上 nul。数组太小,无法全部容纳。
  • @GrijeshChauhan:怎么会这样? %s要求的NUL从哪里来?
  • @GrijeshChauhan 你的说法不正确。
  • 这是 C 中的特殊情况,但在 C++ 中无效。 @IvayloStrandjev 尝试与gcc -Wall -pedantic 一起尝试,你会首先担心,但不会第二次
  • @GrijeshChauhan:你错过了重点,即 printf() 中的 %s 需要 NUL 终止符。 如果没有 NUL,@987654332 的行为@ 未定义。
【解决方案2】:
char a[5]="Mayank";

您正在使用包含 7 个元素(7 个字符)的字符串填充 5 个元素的数组。

"Mayank" 在字符串末尾包含 6 个字符 + 一个空字符 ('\0')

所以这是未定义的行为。所以你会得到一个随机输出。

同样的事情

char b[6]="Mayank";

没关系

char b[7]="Mayank";

【讨论】:

  • 不正确。这不是问题。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2012-05-13
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多