无关函数调用后,C全局指针值发生变化

时间:2015-06-23 17:54:17

标签: c pointers memory

我运行以下代码

records.forEach(function(element) {
    //...
});

输出

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而不是20。我错过了什么?

感谢。

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

您将指针设置为i中的局部变量fun1的地址,并在fun1返回后保持该状态。该地址位于堆叠中,稍后在您致电fun2及其printf来电时会被新值覆盖。

答案 2 :(得分:0)

此处fun1()

pointer = &i;

指定全局指针指向fun1()退出时不再存在的临时变量。因此,当您使用printf致电*pointer时,您正在访问无效内存。

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