【问题标题】:Output of a C string programC 字符串程序的输出
【发布时间】:2013-06-30 05:05:40
【问题描述】:
#include<stdio.h>
int main()
{
  char s[2]="a";
  s[1]='b';s[2]='c';s[3]='d';s[5]='e';
  printf("%s $%c$",s,s[4]);
  return 0;
 }

1.当我在 C (gcc-4.7.2) 中运行此程序时,由于缺少空字符 ('\0'),我预计会出现运行时错误。

2.如果程序仍然编译并成功执行,因为s[4]还没有被初始化,我预计那个地方会有一些垃圾值..但这里我也错了。

上述程序的输出是: abcde $$ 两个 $(dollor) 之间没有字符,表示 printf 跳过了 s[4]。 这是相同的ideone链接: http://ideone.com/UUQxb2

解释这种行为的原因(输出)?

【问题讨论】:

  • 你的程序应该给出编译错误。因为,当 s 仅由 2 个元素组成时,s[4] 或 s[5] 不存在
  • 位置 s[4] 可能只是有一个不可打印的字符。
  • @AswinMurugesh:我已经在问题中给出了ideone链接。它正在编译和执行成功。
  • 我无法理解这种行为。这是如何工作的?
  • 我猜它是 Ideone 编译器的 Array 越界奇怪行为之一。

标签: c string printf output character-arrays


【解决方案1】:

您正在数组范围之外进行写入/读取,这只是undefined behavior 您无法对程序将执行的操作做出任何预测。

【讨论】:

    【解决方案2】:

    越界访问数组是未定义的行为。只是我系统上的一个示例相同代码的输出是abcd(e▒x $($

    长度为 8 的字符串是因为缺少 NULL 终止符,而 $ 之间的字符 (s[4] 的垃圾值。

    【讨论】:

      【解决方案3】:
      1. 不一定会发生运行时错误。 C 不做边界检查。
      2. C 中定义了许多字符。如果我没记错的话,就像声音哔\a 一样,因此没有必要在屏幕上实际打印某些内容。这可能是您从未听过的声音。

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 1970-01-01
        • 2021-07-13
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多