通过函数传递指针,然后变得吉伯利

Passing Pointers through a Function Then Getting Giberish

本文关键字:然后 函数 指针      更新时间:2023-10-16

我有以下代码,它似乎在打印胡言乱语。但是,当我将数组的大小从"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] << ' '; 
}

xarr 的地址,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 运算符一起释放。不执行后者将导致内存泄漏;在这种情况下,泄漏将是轻微的,因为它只会发生一次,并且程序退出时程序的内存空间将被回收,但一般来说,养成释放任何和所有分配内存的习惯是件好事。

祝你好运。

相关文章: