【问题标题】:why does this C code outputs 1为什么这个 C 代码输出 1
【发布时间】:2012-09-21 21:01:23
【问题描述】:

有什么原因吗:

void function_foo(){
    int k[8];
    function_math(k, 8);
}

void function_math(int *k, int i){
    printf("value: %d", k[i]);
}

主执行function_foo();

输出将是 1?矩阵 k 的元素没有初始化。 也许内存中有 int 长度的东西?

我是 C 概念、指针和一切的新手。

【问题讨论】:

  • 我编辑了。 main 执行 function_foo()。
  • @DavidGrayson 嗯? function_math 的调用在 function_foo 中。
  • @DavidGrayson 你不应该从事毫无意义的迂腐。这里有四个答案,他们都答对了。标题和正文都提到“输出”,并且有一个输出语句。无需猜测。 “让它更清楚”——已经很清楚了。

标签: c computation


【解决方案1】:

评估k[8]未定义的行为,因为k 只有 8 个元素,而不是 9 个。

没有必要争论未定义行为的后果。什么事情都可能发生。您的程序格式不正确。

(请注意,评估k[0]、...、k[7] 甚至是未定义的行为,因为它们未初始化。您必须先写入它们,或初始化数组,例如int k[8] = { 1, 2 };。)

【讨论】:

  • 如果它是一个未定义的行为,为什么输出总是1?我的意思是,即使我重建并执行 10 次,我的输出仍然是 1 而不是随机数..
  • @Pier-alexandreBouchard Undefined 可以是 任何东西 - 包括它总是返回 1。
  • @Pier-alexandreBouchard:“任何事情都可能发生”的行为包括“总是返回 1”。它还可以始终从您的照片集中删除文件,或始终订购一个披萨。
  • 呵呵@KerrekSB 这让我笑了:) 但不要惊慌,操作系统(linux、windows 等)会检查你是否尝试从程序的内存空间中调用地址,然后如果您尝试“点披萨”,请关闭程序的灯
  • @JanKoester:在我自己的 AggressivelyNegligentOS 中并非如此,我刚刚完成了一个优化的、自我启发式的 C++ 编译器。我希望让 NASA 为下一个火星着陆器委托它,因为它运行在非常薄弱的​​硬件上......在 3D 中。无论如何,在上周的一个错误之后,我的冰箱里装满了备用比萨饼。
【解决方案2】:

这是在声明数组的最后一个元素之后的内存位置处的值。

如果您在一周内再次运行此代码,它可能是 42 或此时存储在此特定内存地址上的任何其他内容。在这种情况下,也可能出现分段错误。

【讨论】:

  • 这是因为直到现在内存还没有用任何其他值更新。
  • @Pier-alexandreBouchard Jan 说它可能会有所不同,但并非如此。请阅读向您解释这一点的许多答案。
【解决方案3】:

您正在超出数组 k 的范围。

要访问 k 的最后一个元素,请尝试使用 function_math(k, 7)

数组也没有初始化,所以里面的值是未定义的。

【讨论】:

  • 即使从未初始化的变量中读取也是未定义的行为。这比读取未定义的值要糟糕得多。
猜你喜欢
  • 2021-12-15
  • 2011-05-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多