【问题标题】:C global pointer value changes after irrelevant function call [duplicate]不相关的函数调用后C全局指针值发生变化[重复]
【发布时间】:2015-06-23 17:54:16
【问题描述】:

我运行以下代码

int *pointer;

void fun1() {
    int i;
    pointer = &i;
    *pointer = 11;
}

void fun2() {
    printf("\nFun 2: Hello World\n");
}

int main() {
    pointer = (int*) malloc(sizeof(int));
    *pointer = 0;
    fun1();
    printf("%d\n",*pointer);
    fun2();
    printf("%d\n",*pointer);
    return 0;
}

输出是

11

Fun 2: Hello World
20

我希望它是 11 而不是 20。我错过了什么?

谢谢。

【问题讨论】:

标签: c pointers memory


【解决方案1】:

这是未定义行为的示例。当fun1 被调用时,pointer 指向fun1 中的一个自动局部变量。一旦fun1 完成执行,该变量就不再存在。现在声明

printf("%d\n",*pointer);  

调用未定义的行为。
您的程序中也存在内存泄漏。

【讨论】:

  • 那么第一次打印如何给出 11 ? fun1 到此也结束了,不应该也是未定义的行为吗?
  • 那么第一次打印是怎么得到 11 的呢?:编译器在开玩笑!
  • 这不是 Wormbo 说的吗?
  • @illeg;那么它的 UB 和任何事情都可能发生。
【解决方案2】:

您在fun1 中设置了指向局部变量i 的地址的指针,并且在fun1 返回后它保持不变。该地址位于堆栈上,稍后在您调用 fun2 及其 printf 调用期间被新值覆盖。

【讨论】:

    【解决方案3】:

    这里是fun1()

    pointer = &i;
    

    您分配全局指针以指向一个在fun1() 退出时不再存在的临时变量。因此,当您使用*pointer 调用printf 时,您访问的是无效内存。

    这是未定义的行为,之后尝试了解无效内存区域的内容是不值得的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      相关资源
      最近更新 更多