指针使用错误或错误
Wrong use of pointer or a bug?
我遇到了一些奇怪的事情,找不到任何合理的东西。我写了一个这样的函数,它返回一个像这样的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;
}
这是一个错误的用法。数组是函数的本地数组,因此您返回的指针在离开函数的那一刻就无效了。在那之后的任何时候,内存都可以重复使用。
(特别是,在这个具体的例子中,在不暗示这种行为以任何方式得到保证的情况下,在您的示例循环中,打印第一个整数的函数会用它们的局部变量覆盖其他函数。)
相关文章:
- 删除指向指针的指针是运行时错误吗
- c++中的指针和运行时错误
- 运行几次后合并段错误C++(指针算术)
- LinkedList实现C 错误指针间接
- 虚幻引擎 4.18.0,VS2017,不允许指向不完整类类型的错误指针
- Xcode 错误:指针和双精度之间的比较
- 未分配正在释放的本机node.js插件错误指针
- 错误指针:解析令牌时无法计算表达式
- C++-va_list错误指针
- 为什么我收到错误" (指针的名称)不是模板)?
- mmap 错误:分段错误/指针无效错误
- C++ Winsock2 错误指针断点触发
- C++ 代码中的错误指针错误
- 数组错误指针上的增量运算符
- MAKEINTRESOURCE 返回资源 ID 的错误指针
- 分段错误C++指针
- 段错误指针
- C++ 错误 :: 指针数组的EXC_BAD_ACCESS
- 通过模糊 mat 从 std::vector: <int>cv::Exception 中获取错误指针
- 正在解决编译器错误:指针可能未初始化