【问题标题】:C. Ok in main but segmentation fault when inside functionC. 在 main 中正常,但在函数内部时出现分段错误
【发布时间】:2017-07-05 13:18:51
【问题描述】:

这段代码给出了分段错误,但如果直接在主函数中编写测试函数体,它可以正常工作。那么,您认为造成这个问题的原因是什么?

分段错误:

#include<stdio.h>

int test()
{
    int i=0;
    int *p;
    printf("pass\n");
    for (i = 0; i < 24; i++)
    {
        printf("%d\n",i);
        *(p+i) = i;
        printf("%d\n",*(p+i));
    }
    return 1;

}

int main() {
    int x = 0;
    x = test();
}

工作正常:

int main() {
    int i=0;
    int *p;
    printf("pass\n");
    for (i = 0; i < 24; i++)
    {
        printf("%d\n",i);
        *(p+i) = i;
        printf("%d\n",*(p+i));
    }
}

编辑:在投给我一堆反对票之前,请先尝试一下代码。我知道这是糟糕的编程。我正在评估一些 C 代码考试,并且有一个学生写了这个。是的,不是很好,但工作版本确实可以工作。

【问题讨论】:

  • x = teste(); 不应该是test 吗?错字?此外,使用未分配或未分配的内存,然后想知道它为什么会出错?
  • 未定义的行为是未定义的
  • 两个版本都没有 版本真正有效。指针p指向哪里?
  • 我不需要“尝试”,因为未初始化的局部变量具有 indeterminate 值。如果这样的变量是一个指针,并且您取消引用它,您拥有undefined behavior。如果你有 UB,那么这会让你整个程序格式错误并且无效。
  • 嗯...如果您正在评估一些 C 代码考试,您不应该了解 undefined dbehaviour 吗?

标签: c segmentation-fault


【解决方案1】:

p 指针在这两种情况下都没有初始化。它包含一个未确定的值。

取消引用未初始化的指针是未定义的行为(谷歌)。

在第一种情况下,您的指针 p 碰巧指向取消引用不会以段错误结束的地方(即允许您的进程读取的有效内存),但在第二种情况下,它指向取消引用确实最终导致段错误的另一个位置(取消引用您的进程不允许读取的内存)。

【讨论】:

  • @Miguel 它是由 chance “工作”的。例如在我的电脑上,两个例子都是段错误。
  • @Miguel 你很幸运,你的未初始化指针指向了一些幸运你的程序的有效位置。
  • 好的,谢谢。即便如此,这也很奇怪。这不能只是运气的问题。
  • @Miguel,顺便说一句,这里没有人侮辱任何人。人们只是坚持未定义行为的概念。
  • 老实说,如果应用程序产生了预期的输出,那就太倒霉了——您可能会在发现其行为未定义之前将应用程序交付给 10,000 个客户。
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
相关资源
最近更新 更多