指针使用错误或错误

Wrong use of pointer or a bug?

本文关键字:错误 指针      更新时间:2023-10-16

我遇到了一些奇怪的事情,找不到任何合理的东西。我写了一个这样的函数,它返回一个像这样的int指针:

int* arr()  
{  
  int array[3]={1,2,3};  
  return array;  
}

现在,我主要声明了一个int指针,如k:

int*k=arr();

它工作得很好,但奇怪的是,我只能使用其中一个块,k[0]或k[1]或k[3],它会打印正确的对应数字,但当想在这样的for中使用它时,只有第一个块会正确打印:

for(int i=0;i<3;i++)
{
  cout<<k[i]<<endl;
}

对于k[0],打印的值是正确的,但对于其他值,则有些奇怪。我想知道,如果我没有正确使用指针,为什么我可以访问每个块?

int array[3]={1,2,3};是堆栈分配的。在函数结束时,它将超出范围。

您将访问一个悬挂指针。这是未定义的行为。繁荣

您正在返回一个指向在函数堆栈上创建的对象(此处为数组)的指针。例如,您可以使用std::vector将一个数组从函数传递给调用者。

std::vector< int > arr()
{
    std::vector< int > array = { 1, 2, 3 };
    return array;
} 

您没有正确使用它。此函数返回一个指针,指向在函数末尾被销毁的数组:

int* arr()  
{  
  int array[3]={1,2,3};  
  return array;  
}

这意味着,您的程序调用了一个未定义的行为,然后任何事情都可能发生。

如果你不想让你的数组成为全局的,那么就把它变成一个静态的:

int* arr()  
{  
  static int array[3]={1,2,3};  
  return array;  
}

这是一个错误的用法。数组是函数的本地数组,因此您返回的指针在离开函数的那一刻就无效了。在那之后的任何时候,内存都可以重复使用。

(特别是,在这个具体的例子中,在不暗示这种行为以任何方式得到保证的情况下,在您的示例循环中,打印第一个整数的函数会用它们的局部变量覆盖其他函数。)