我想通过遵守代码让我感到困惑。假设我有两个简单的函数:
int* makeiniele()
{
int res[55] = { 0 };
return res;
}
和
void printele(int* wxyz)
{
for (int k = 0; k < 55; k++)
{
cout << wxyz[k] << "\n";
}
}
问题在于我运行以下行:
printele(makeiniele());
我得到55个大的负数而不是55个零!
感谢您的时间
答案 0 :(得分:0)
两个问题:
1)数组未初始化为包含55个零,但只有1个,其余54个元素将是一些较旧的内存内容:
int res[55] = { 0 };
您需要使用memset()
函数才能有效地执行此操作:
int res[55];
memset(res, 0, sizeof(res));
2)您在makeiniele()
函数中声明的数组将在从函数返回后被释放(并且因为它存在于堆栈中),其内容将被下一个函数{{的调用覆盖。 1}}。因此,正确初始化不会解决您的问题。
解决方案是考虑使用printele()
来分配数组。您的malloc()
函数应如下所示:
makeiniele()
请记住在完成数组后调用int* makeiniele(){
int *res = malloc(sizeof(int)*55));
memset(res, 0, sizeof(int)*55);
return res;
}
以避免内存泄漏。
答案 1 :(得分:0)
int* makeiniele()
{
int res[55] = { 0 };
return res;
}
问题在于范围 - 一旦函数结束,函数中声明的任何变量都将从内存中删除。函数makeiniele
终止后,数组res
也会从内存中删除。阵列占用的内存已经被其他东西取代了 - 这个“别的东西”就是在屏幕上打印出来的东西。您可以使用以下代码进行验证:
int * myvar = new int[55]{ 0 };
int* var = myvar;
printele(var);
delete myvar;
printele(var);
第55个数字将为零(该变量尚未删除)。一旦用delete
手动删除变量,它的地址现在指向未使用的内存,因此它会随机输出数字。要解决此问题,请将此makeiniele
功能替换为:
int* makeiniele()
{
int * myvar = new int[55]{ 0 };
return myvar;
}
一切都应该正常工作!
编辑:正如Zereges所说,你必须确保以结束你的程序delete myvar;
防止内存泄漏。
答案 2 :(得分:0)
一个现代的C ++答案。
使用聪明的数组(std::vector
)
std::vector<int> makeiniele()
{
std::vector<int> res(55, 0);
return std::move(res);
}
void printele(const std::vector<int>& wxyz)
{
for (int k = 0; k < 55; k++)
{
cout << wxyz[k] << "\n";
}
}
或使用聪明的指针(std::shared_ptr
)
std::shared_ptr<int> makeiniele()
{
std::shared_ptr<int> res(new int[55]);
std::memset(res.get(), 0, 55 * sizeof(int));
return std::move(res);
}
void printele(std::shared_ptr<int> wxyz)
{
for (int k = 0; k < 55; k++)
{
std::cout << wxyz.get()[k] << "\n";
}
}