通过函数传递指针然后变得粗鲁

时间:2015-06-18 23:59:39

标签: c++ function pointers

我有以下代码,似乎是打印乱码。但是,当我从" 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] << ' '; 
}

2 个答案:

答案 0 :(得分:2)

xarr的地址,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;
}

请注意,在checkl的内存是使用new运算符动态分配的,而main内存随后随delete一起释放运营商。不执行后者将导致内存泄漏;在这种情况下,泄漏会很小,因为它只会发生一次,并且当程序退出时程序的存储空间将被回收,但一般来说,养成释放任何和所有分配的习惯是好的。存储器中。

祝你好运。