指针数组中的垃圾值

时间:2013-02-19 05:31:48

标签: c local-variables

#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 

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

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:0)

int j=10;

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