#include <stdio.h>
void func(int **);
int main()
{
int *arr[2];
func(arr);
printf("value [1] = %d \n",*arr[0]);
printf("value [2] = %d \n",*arr[1]);
return 0;
}
void func(int **arr)
{
int j = 10;
arr[0] = &j;
arr[1] = &j;
}
使用gcc成功编译代码。但是,输出是:
value [1] = 10
value [2] = 32725
第二个值是垃圾值。为什么会这样?如何正确使用双指针访问数组?
答案 0 :(得分:9)
Undefined Behavior
您正在存储除函数之外不存在的局部变量j
的地址
保证j
仅存在于函数范围{ }
内。一旦此范围结束导致未定义的行为,请通过其地址引用j
。
未定义的行为意味着不需要编译器来显示任何特定的观察行为,因此它可以显示任何输出。
答案 1 :(得分:0)
int j=10;
是在堆栈上分配的局部变量。在函数外部取消引用它是未定义的行为。 警告:除非您非常确定自己在做什么,否则永远不要返回指向任何局部变量的指针。如果你确定,再考虑一下。