两次读取指针就是给出垃圾值
Reading pointers twice is giving garbage values
我想通过指向主函数的指针返回在本地函数中创建的数组。我的代码在下面。数组被返回,我只能逐个元素访问一次。下次它给出垃圾值时。什么是错的?
void DoWork(int** ppOut , int& nSize)
{
int m[5];
for(int i = 0 ; i < 5 ; i++)
{
m[i] = i;
}
nSize = 5;
cout << m[0] << endl;
cout << m[1] << endl;
cout << m[2] << endl;
cout << m[3] << endl;
cout << m[4] << endl;
*ppOut = &m[0];
//delete [] m;
}
void main()
{
int nSize = -1;
int i;
int* f = NULL;
DoWork(&f , nSize);
cout << f[3] << endl;
cout << f[0] << endl;
cout << f[2] << endl;
cout << f[3] << endl;
cout << f[4] << endl;
_getch();
}
本地函数的输出为:--0 1 2 3 4。但在主要的3和其余是全麦值
问题:
数组m
是一个局部数组,在函数DoWork()
的生存期之后不会存在。当你这样做时,你最终会得到未定义的行为,这基本上意味着你可以看到任何可观察的行为,因为该程序不再是C++标准批准的程序,因此它可以显示(字面上)任何行为。
解决方案:
您需要延长m
的生存期,以便它在函数返回后仍然有效。有很多方法可以做到这一点:
- 在函数&将指向它的指针传递给函数
- 在函数内部创建一个静态数组
- 函数中的数组使用动态内存(使用后一定要记得释放)
- 使用全局数组,该数组可以放入函数中
每个人都有自己的优点和缺点,当然也有更多的马匹。
附带说明一下,void main()
不是main()
的标准指定原型,它应该返回int
:
int main()
- C++程序中的主函数应该是
int main
- 返回指向局部变量的指针会显示未定义的行为
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- 不能通过两次带大括号的指针
- 为什么当我在同一内存中各有两个指针时,我必须调用"delete"两次?
- 析构函数在与 STL 的共享指针中调用两次
- 两次读取指针就是给出垃圾值
- 静态 c++ 对象中的 JNI 环境指针并调用连续两次使用字符串参数的 Java 函数会使 JVM 崩溃
- C++重载getter两次,一次返回指针,另一次返回常量引用,都失败了
- Java用JNI调用C++:为什么JNIEnv指针被取消引用两次
- c++删除指针两次
- 什么是delete指针,指针=0;表述功?它清除内存两次吗?
- C++两次传递函数指针导致问题
- 为什么删除指针两次会导致崩溃
- Mmap()返回相同的指针两次