函数似乎改变了指针指向的位置

时间:2019-02-22 12:38:04

标签: c

我编写了以下C代码:

#include <stdio.h>
#include <stdlib.h>

int *getPointer(int var);
void anotherFunction();

int main ( int argc , char * argv [])
{
  int *intPtr = getPointer(3); 
  printf("%d\n",*intPtr);
  anotherFunction();
  printf ("%d\n",*intPtr);
  getPointer(5);
  printf("%d\n", *intPtr);
  return EXIT_SUCCESS ;
}

// Which problem occurs here?
int *getPointer(int var) {
  int *ptr=&var;
  return ptr;
}
void anotherFunction(){
  // do nothing
  int a [ 5 ] = { 4 , 5 , 6 , 7 , 8 };
}

输出为:

3
7
5

我不明白为什么intPtr的值在第二个printf()调用中发生变化。多谢您的协助! 谢谢

2 个答案:

答案 0 :(得分:1)

此功能完全没有意义,而且是错误的:

int *getPointer(int var) {
  int *ptr = &var;
  return ptr;
}

ptr指向局部变量var(是的功能参数与局部变量大致相同)。但是一旦函数返回,该变量就不存在了。因此,getPointer返回的指针基本上指向垃圾。

答案 1 :(得分:0)

您获得的指针是指向var局部变量的指针。该变量存储在 STACK 中(不在堆中)。

所以,有几件事:

  1. 函数调用结束后,依靠 STACK 变量的指针只是 WRONG 。不要那样做永远不会。
  2. 第二个printf在堆栈中打印某些内容,这些内容在您调用anotherFunction时被覆盖。在这种情况下可以正常工作,但是这种行为是不确定的(也可能导致分段错误)。