【问题标题】:Function seems to change where pointer is pointing to [duplicate]函数似乎改变了指针指向的位置[重复]
【发布时间】:2019-02-22 12:38:03
【问题描述】:

我编写了以下 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() 调用中发生变化。我会很感激你的帮助! 谢谢

【问题讨论】:

标签: c


【解决方案1】:

这个函数完全没有意义和错误:

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

ptr 指向局部变量var(是的,函数参数或多或少与局部变量相同)。但是一旦函数返回,该变量就不再存在了。所以getPointer返回的指针基本指向垃圾。

【讨论】:

    【解决方案2】:

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

    所以,有几件事:

    1. 在函数调用结束后依赖指向 STACK 变量的指针只是 错误。不要那样做。从不。
    2. 第二个printf 正在打印堆栈中的某些内容,当您调用anotherFunction 时该内容已被覆盖。这在这种情况下有效,但这种行为是未定义的(它也可能导致 SEGMENTATION FAULT)。

    【讨论】:

      猜你喜欢
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2010-10-27
      相关资源
      最近更新 更多