【问题标题】:Returning array address from function [duplicate]从函数返回数组地址[重复]
【发布时间】:2014-09-22 01:46:27
【问题描述】:

我试图将数组地址从函数传递给完美发生的主函数。但是当我取消引用 main() 中的地址时,我得到了垃圾值。我猜 array_address 内存中的变量只存在于函数的范围内。如果是这种情况,如何将一个函数中生成的数组返回给另一个函数?

这是我的代码:

int* letssee(int something)
{
    int* array_address;
    int a[10], i=0;
    array_address = &a[0];

    for (i; i<something;i++)
    {
            *(array_address+i) = i;
            printf("\n%p, %d",(array_address+i), *(array_address+i));   

    }

    return array_address;

     }

int main()

{
    int i= 5,j;
    int* catch_address;
    catch_address = letssee(i);

    printf("\n");
    for (j= 0; j<i; j++)
    {
    printf("%p, %d\n", (catch_address+j),*(catch_address+j));  
    } 

    return 0;
}

【问题讨论】:

  • 返回指向非静态局部变量的指针或引用会导致未定义的行为,因为该变量在函数返回后不再有效。
  • 哦..所以我要做的就是制作一个静态数组?然后通过?
  • 成功了:D 谢谢@CaptainObvlious
  • 不,不要那样做……那是以后灾难的根源。为什么不通过 new 分配缓冲区(或从调用者传入缓冲区)

标签: c arrays function


【解决方案1】:

您不能返回函数中定义的数组,因为它是在堆栈上分配的,并且会在函数完成后消失。相反,您分配内存

int *array_address = malloc(sizeof(int) * 10);

但是,你必须管理内存,这意味着你必须在完成后“释放”它,否则你会泄漏内存

另一种方法是将预先分配的内存传递给函数(无论是通过 malloc 还是堆栈或全局)

int* letsee(int something, int* array_address, int count);

如果您只是将数组设为静态,则实际上是在创建一个全局变量,多次调用该函数将返回相同的地址,如果您期望每次调用都有新数组,则可能会导致奇怪的行为。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 2012-02-03
  • 1970-01-01
  • 2021-11-23
  • 2014-03-30
相关资源
最近更新 更多