返回指针的函数

时间:2018-03-11 11:55:18

标签: c function pointers scope

我正在刷新对C的记忆,我想测试指针。

我做了这个简单的程序,我在其中调用一个函数,该函数返回指向其参数中最大整数的指针

int*function_pointer (int a, int b, int c);

int main ()
{
      printf("Testing pointers\n");// line 1

      int*pointer = pointer_function(10,12,36);
      //pointer_function(10,102,36) is assigned to int*pointer

      printf("Okay, what now...\n");//line 3


      return 0;
}

指针功能

int*function_pointer (int a, int b, int c)
{
     int x;
     int*ptr = &x;
     //initially ptr points to the address of x

     if(a > b)
     {
          if(a > c)
          {
               printf("a is the greatest\n);
               ptr = &a;
          }
     }

     if(b > a)
     {
          if(b > c)
          {
              printf("b is the greatest\n");
              ptr = &b;
              //b is 102, so in this scope ptr points to the address of b
          }
     }

     if(c > a)
     {
          if(c > b)
          {
              printf("c is the greatest\n");
              ptr = &c;
          }
      }

      return ptr;
      //function returns the value of ptr which is the address of b
}
    主要功能function_pointer(10,102,36)中的
  • 称为
  • function_pointer(...)内,为该范围创建了int a, b, c
  • 最初ptr = &x
  • b = 102ptr = &b
  • 以来
  • 函数返回ptr
  • 的值
  • 在主pointer = ptr,因此pointer = &b
  • b超出范围,且没有任何内容
  • 所以怎么来*pointer = 102,不应该返回垃圾值,因为b没有主函数的范围

1 个答案:

答案 0 :(得分:1)

  

但是b超出了范围,并且没有任何内容

您的指针在技术上仍然有效,它只指向内存区域。它是你的情况,当function_pointer()返回b仍指向它用于本地变量的内存时(因此,在你的堆栈中)。你不应该再使用内存了,但是当你的指针指向的内存内容默认情况下不再使用时会被归零,那么你很幸运还有以前的内存值102仍然存在,因为您的堆栈扩展时间不超过自function_pointer()以来返回的内容,因为没有其他代码需要这样做。

如果您想进行某些测试,可能需要创建另一个在function_pointer()之后调用的函数。如果你需要新的函数局部变量(即150 int s的数组)。使您的代码使用更多堆栈并覆盖剩余部分。然后你将不再看到102