【问题标题】:Why is the seventh variable 6 in my program?为什么我的程序中的第七个变量是 6?
【发布时间】:2017-07-12 05:37:23
【问题描述】:
#include <stdio.h>

int main(void) {
    int n,i;
    int str[n];

    scanf("%d\n",&n);
    for(i=0;i<=n;i++)
    {
        scanf("%d",&str[i]);
        printf("%d th %d\n",i,n);
    }
    return 0;
}

输入:

10

8 9 2 1 4 10 7 6 8 7

输出:

0 th 10

1 th 10

2 th 10

3 th 10

4 th 10

5 th 10

6 th 10

7 th 6

为什么输出是 6?

【问题讨论】:

  • C 是一种命令式编程语言,而不是声明性的。这大致意味着您的程序是逐行执行的。您不能声明一个在n 更改时会自动更新其大小的数组,您只能声明一个大小在n 在声明点的数组。
  • 问题 (i) 写得很好,(ii) 包含简短的可编译代码,(iii) 记录实际输出,(iv) 记录预期输出。两个老用户提交了很好的答案,这增加了问题的可信度。那么为什么要投反对票呢?
  • @Bathsheba 可能是因为这个问题表明他没有得到 C 的“基本概念”,因此这是一个糟糕的问题,他是一个坏人 ;)
  • @Bathsheba - 老实说,我认为不赞成票是由于帖子的第一版中的可怕格式。我修复了它,我希望人们现在重新评估他们的投票,但你知道......投票和运行在 SO 上很受欢迎。

标签: c loops variable-length-array


【解决方案1】:

在您的代码中

int n,i;
int str[n];

您正在使用n,而它的值不确定,已单元化。它调用undefined behavior

详细地说,n 是一个自动局部变量,除非显式初始化,否则包含不确定的值。

解决方案:您需要定义int str[n];您从用户那里获取价值(并清理)。

之后,又出现了一个问题,您的循环对数组逐个运行。 C 使用基于 0 的数组索引,因此,对于大小为 n 的数组,有效索引将是 0n-1。你的循环构造应该是

for(i=0; i<n; i++)

【讨论】:

    【解决方案2】:

    字符串 str[] 的大小值尚未定义。您需要在声明字符串/数组之前初始化此值。

    如果您使用 gcc 进行编译,请尝试在编译行中包含 -Wall 标志以捕获此类错误。

    【讨论】:

      【解决方案3】:

      这是非常奇怪的代码,具有未定义的行为。您对此有何期待:

      int n;  // No value!
      int str[n];
      

      做什么?你会得到一个长度未知的数组,因为nstr 声明处没有值。

      如果您希望编译器在nscanf() 赋予一个值时神奇地“穿越”回到str[n] 行,那么……这不是 Co 的工作方式,您应该认真阅读在语言上多一点。并使用您可以从环境中获得的所有警告进行编译。

      作为一个额外的细节,即使它被修复以使 n 有一个值,for 循环溢出数组并给你未定义的行为再次 .

      对于大小为m 的数组,循环头应为

      for (size_t i = 0; i < m; ++i)
      

      由于索引是从 0 开始的,您不能在数组外部的 m 处进行索引。

      【讨论】:

      • 有趣的是,您可以使用 C++ 中的演员来设计这个“时间旅行”属性。顺便说一句,答案很好。
      猜你喜欢
      • 2019-12-17
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多