我运行以下代码
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。我错过了什么?
感谢。
答案 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
时,您正在访问无效内存。
这是未定义的行为,之后尝试理解无效内存区域的内容是不值得的。