我遇到了一些比较奇怪的东西,我找不到任何合理的东西。 我写了一个这样的函数,它返回一个像这样的int指针:
int* arr()
{
int array[3]={1,2,3};
return array;
}
现在在main中,我声明了一个像k:
这样的int指针int*k=arr();
它工作得很好,但这是奇怪的事情,我只能使用其中一个块,k [0]或k [1]或k [3],它会打印正确的相应数字但是当想要在这样的情况下使用它只有第一个才能正确打印:
for(int i=0;i<3;i++)
{
cout<<k[i]<<endl;
}
对于k [0],打印值是正确的,但对于其他人来说这是奇怪的。 我想知道如果我没有使用指针,为什么我可以访问每个块?
答案 0 :(得分:6)
int array[3]={1,2,3};
是堆栈分配的。它将在函数结束时超出范围。
您将访问悬空指针。这是未定义的行为。吊杆!
答案 1 :(得分:5)
您正在返回指向在函数堆栈上创建的对象(此处为数组)的指针。例如,您可以使用std :: vector将数组从函数传递给调用者。
std::vector< int > arr()
{
std::vector< int > array = { 1, 2, 3 };
return array;
}
答案 2 :(得分:3)
您没有正确使用它。此函数返回一个指向在函数末尾被破坏的数组的指针:
int* arr()
{
int array[3]={1,2,3};
return array;
}
这意味着,您的程序会调用未定义的行为,然后可能发生任何事情。
如果您不想将数组设为全局数组,请将其设为静态数据:
int* arr()
{
static int array[3]={1,2,3};
return array;
}
答案 3 :(得分:2)
这是错误的用法。该数组是函数的本地数组,因此当您离开函数时,返回的指针将变为无效。在此之后的任何时刻都可以重复使用内存。
(特别是,在这个具体的实例中,没有暗示这种行为以任何方式得到保证,在你的示例循环中,打印第一个整数的函数用其局部变量覆盖其他整数。)