2
#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 

第二个值是垃圾值。为什么会这样?如何正确使用双指针访问数组?

4

2 回答 2

9

这是未定义的行为。您正在存储函数之外不存在
的局部变量的地址。保证只存在于函数范围内。一旦此范围结束,通过其地址引用会导致未定义的行为。 j
j{ }j

未定义的行为意味着编译器不需要显示任何特定的观察到的行为,因此它可以显示任何输出。

于 2013-02-19T05:33:47.763 回答
0
int j=10;

是分配在堆栈上的局部变量。在函数之外取消引用它是未定义的行为。 警告:除非您非常确定自己在做什么,否则永远不要返回指向任何局部变量的指针。如果您确定,请再考虑一下。

于 2013-02-19T05:37:36.223 回答