【问题标题】:Segmentation fault(core dumped ) error while executing a function which returns an integer pointer [duplicate]执行返回整数指针的函数时出现分段错误(核心转储)错误[重复]
【发布时间】:2014-02-10 14:34:00
【问题描述】:

下面的程序运行良好

#include <stdio.h>
#include <string.h>
int * p(void);
main()
{
    int *x = p();
    printf("%d", *x);
}
int * p(void)
{
    int x;
    x=10;
    return (&x);
}

但是,如果我像这样修改上面的程序

 #include <stdio.h>
 #include <string.h>

    int * p(void);
    main()
    {
        int *x = p();
        printf("%d", *x);
    }
    int * p(void)
    {
        int *x;
        *x=10;
        return (x);
    }

在执行上述代码时,会引发分段错误。

谁能解释这种行为?

【问题讨论】:

  • 您说运行良好的程序具有未定义的行为(它有问题)。在其生命周期结束后使用左值(在本例中为局部变量 x)是未定义的行为,如果幸运的话,它会在测试期间崩溃,因此您可以修复错误。它不会崩溃的事实只是该错误的一种可能表现。
  • 您在第二种情况下传递局部变量的地址。这将导致未定义的行为。
  • 尝试在这里讨论问题stackoverflow.com/questions/13888268/…
  • @kripanand 这是第一种传递局部变量地址的情况,而不是第二种情况,它取消引用未初始化/未分配的指针。
  • @moeCake 你是对的。正如在第二种情况下已经回答的那样,没有分配地址并且值被写入某个随机地址,这导致了 seg。故障

标签: c


【解决方案1】:

1) 您的第一个程序收到警告,第二个程序收到错误。

但是对第二个程序试试这个:首先使用 malloc 分配内存,然后取消引用指针:

    #include <stdio.h>
    #include <string.h>

    int * p(void);
    main()
    {
         int *x = p();
         printf("%d", *x);
    }
    int * p(void)
    {
       int *x = (int *)malloc(sizeof(int));
       *x=10;
       return (x);
    }

【讨论】:

    【解决方案2】:

    Case1:p() 返回 'x' 的地址,该地址存储在 main 的 int *x 版本中,您可以在 printf 中取消引用它以打印该值。 (编辑:这也是错误的,因为 p() 中的 'x' 对 p() 是本地的,并且一旦 p 返回它就会'停止存在')。

    案例 2:您创建 *x,然后在将任何内容分配给它之前取消引用它 (x)。 最有可能的是,当您在堆栈上声明某些内容时,它将具有随机值。赋值 - *x = 10 将尝试将值 10 写入指针指向的任何地址(即 x 本身的值)。 libc 可以检测到这样的非法访问和段错误。

    【讨论】:

      【解决方案3】:

      您在两者中都犯了错误,这会导致未定义的行为。

      1.

      int * p(void)
      {
          int x;
          x=10;
          return (&x);    <---
      }
      

      返回一个局部变量的地址,返回后不存在

      2.

      int * p(void)
      {
          int *x;
          *x=10;    <---
          return (x);
      }
      

      取消引用不指向任何有效内存的指针

      【讨论】:

      • 第一个是打印值 10。
      • @user3217911 未定义行为是未定义
      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 2015-05-12
      • 2017-07-24
      • 2012-06-06
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多