通过函数传递指针,然后变得吉伯利
Passing Pointers through a Function Then Getting Giberish
我有以下代码,它似乎在打印胡言乱语。但是,当我将数组的大小从"r"更改为 5000 时,它工作得很好。任何人都可以解释这种行为并告诉我如何解决它吗?我对此做了很多研究,但找不到答案。
#include <iostream>
#include <cstring>
using namespace std;
int * check (int leng)
{
const int r = leng;
int arr [r];
memset(arr,0,sizeof(arr));
int * x = arr;
return x;
}
main()
{
int * l = check(20);
for (int g=0; g<5; g++) cout << l[g] << ' ';
}
x
是 arr
的地址,arr
是一个堆栈变量,因此您不能将其作为返回值传递。 如果你想让check
返回一个指向数组的指针,你需要用new:arr = new int[r]
分配它。 请注意,您最终需要通过delete[]
释放内存 有关动态内存分配的详细信息,您可以查看此链接。
正如您所发现的,在堆栈上分配一个变量并返回指向该内存的指针可能会导致垃圾。堆栈在每一系列函数调用中被使用和重用,因此函数分配的内存将被其他函数调用重新用于不同的目的。您需要分配要在函数外部使用的内存,作为任何函数外部的静态分配,或者作为动态分配。处理此问题的一种方法是:
#include <iostream>
#include <cstring>
using namespace std;
int * check (int leng)
{
const int r = leng;
int *x = new int [r];
memset(x, 0, r * sizeof(int));
return x;
}
main()
{
int * l = check(20);
for (int g=0; g<5; g++) cout << l[g] << ' ';
delete l;
}
请注意,在check
中,l
的内存是使用 new
运算符动态分配的,main
中,该内存随后与 delete
运算符一起释放。不执行后者将导致内存泄漏;在这种情况下,泄漏将是轻微的,因为它只会发生一次,并且程序退出时程序的内存空间将被回收,但一般来说,养成释放任何和所有分配内存的习惯是件好事。
祝你好运。
相关文章:
- 为什么我的递归函数按降序打印,然后按升序打印?
- 等待整个 omp 块完成,然后再调用第二个函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么 ComPtr 的函数返回不同的值,然后 &?
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何在C++中获取lua函数作为参数,然后调用它
- 如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?
- 钩/绕道 d3d9 (现在/结束场景) - 似乎调用我的函数然后崩溃
- 使用函数打开文件,然后让其他函数利用该文件?
- C++:将向量传递给函数,然后在main中调用函数.错过了什么
- 努力将指向成员函数的指针绑定到类模板的T成员,然后在槽中调用
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- C++大括号初始值设定项作为参数调用不同的构造函数,然后预期
- C++ 如何创建 2D 数组,将其传递给另一个函数,然后打印
- 如何在 LLVM 传递期间破坏然后解散函数?
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- C++11 中的随机数:有没有一种简单的方法可以将生成器种子放在代码的一个位置,然后在不同的函数中使用它?
- 将int输入函数,将int输入开关,然后更改int的值