【问题标题】:Pointers and function arguments指针和函数参数
【发布时间】:2014-01-02 18:07:24
【问题描述】:

下面的代码 sn-p 给出了输出 11 11 undefined 值。但是为什么当第二次执行相同的语句时我得到未定义的值?这与函数的范围有关吗?

   void foo(int **const p)
        {
            int j = 11;
            *p = &j;
            printf("%d ", **p);
        }

    int main()
        {
            int i = 10;
            int *p = &i;
            foo(&p);
            printf("%d ", *p);
            printf("%d ", *p);
        return 0;
        }

【问题讨论】:

    标签: c


    【解决方案1】:

    foo() 退出时,*p 指向一个不再存在的变量。因此,您正在调用未定义的行为。

    【讨论】:

    • 这是我仍然无法理解的东西,为什么它在函数执行后第一次工作,并且在随后的尝试中失败。我希望 main 中的第一个 printf 也会失败
    • @DavidBo 这就是重点 - 任何事情都可能发生。一旦调用了未定义的行为,程序的行为方式没有任何规则。这将取决于您的实施。主要规则是根本不调用 UB。
    • @DavidBo 这取决于代码的编译方式。变量超出范围后,它不会被自动覆盖,它的值只会保留在那里,直到其他一些指令使用该内存位置来存储另一个值。在示例中,第一次 printf 的执行覆盖了 p 指向的内存位置,这就是为什么当您第二次读取它时,您会看到它的值发生了变化。
    • @HAL9000 非常感谢您的详细解释。
    【解决方案2】:

    您指向的项目在foo 函数返回时已被释放。这是一个错误,然后发生未定义的行为。

    变量超出范围后,它不会被自动覆盖,它的值只会保留在那里,直到其他指令使用该内存位置来存储另一个值。在示例中,第一次 printf 的执行覆盖了 p 指向的内存位置,这就是为什么当您第二次读取它时,您会看到它的值发生了变化。

    您可以按如下方式修复它:

    void foo(int **const p)
    {
        int *j = (int *)malloc(sizeof(int));
        *p = j;
        printf("%d ", **p);
    }
    int main()
    {
        int i = 10;
        int *p = &i;
        foo(&p);
        printf("%d ", *p);
        printf("%d ", *p);
        free(p)
        return 0;
     }
    

    它并不漂亮,但出于教育目的,它可以是好的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-07
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多