我有以下代码,似乎是打印乱码。但是,当我从" 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] << ' ';
}
答案 0 :(得分:2)
x
是arr
的地址,arr
是堆栈变量,因此您无法将其作为返回值传递。如果希望check
返回指向数组的指针,则需要使用new:arr = new int[r]
进行分配。请注意,您最终需要通过delete[]
释放内存。有关动态内存分配的详细信息,您可以查看this link。
答案 1 :(得分:0)
正如您所发现的那样,在堆栈上分配变量并返回指向该内存的指针可能会导致垃圾。堆栈被使用并在每个函数调用系列中重复使用,因此由函数分配的内存将被其他函数调用重用于不同的目的。您需要分配要在函数外部使用的内存,或者作为任何函数之外的静态分配,或者作为动态分配。解决这个问题的一种方法是:
#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
一起释放运营商。不执行后者将导致内存泄漏;在这种情况下,泄漏会很小,因为它只会发生一次,并且当程序退出时程序的存储空间将被回收,但一般来说,养成释放任何和所有分配的习惯是好的。存储器中。
祝你好运。