【问题标题】:How can I Return an array from a function without using malloc?如何在不使用 malloc 的情况下从函数返回数组?
【发布时间】:2012-04-20 02:38:32
【问题描述】:

我一直在为 C 语言中的一个简单任务而苦苦挣扎……(已经有一段时间了。)我需要构建一个函数来创建和重置结构数组,而无需使用任何内存分配函数。

我最初是用malloc设计的:

typedef struct {
    int ..
    int ..
} Branch;

Branch* createBranchList (int N)
{
    Branch *List;
    Branch reSet = {0}; // a zero'd Branch struct used for the resetting process
    int i;

    if(!(List=(Branch*)malloc(sizeof(Branch)*N))){
        printf("Allocation error");
        return NULL;
    }

    for(i=0; i<N; i++)
        List[i] = reSet;

    return List;
}

现在如何在不使用内存分配的情况下做到这一点?我可以返回参考吗?我不这么认为。

感谢任何人的帮助。

【问题讨论】:

  • 在c中你不能返回引用,因为没有这样的东西。

标签: c arrays memory pointers return


【解决方案1】:

安全方法(一):

用数组成员定义一个结构,然后返回它。

例如:

struct MyContainer {
    Thing x[42];
};

MyContainer foo(void) {
    MyContainer m;
    m.x[0] = 5;
    m.x[1] = 10;
    ...
    return m;
}

显然,如果函数在编译时不知道数组大小,则此方法将不可行。

安全方法(二):

让调用者将数组作为参数传入。

例如:

foo(Thing *things, int N) {
    thing[0] = 5;
    thing[1] = 10;
    ...
}

不安全的方法:

声明一个静态局部数组,并返回一个指向它的指针。

这“有效”是因为静态数组在超出范围时不会被释放。但这是不安全的,因为下次使用该函数时数组将被覆盖(在多线程场景中尤其糟糕)。

如果函数在编译时不知道数组大小,则此方法也不可行。

【讨论】:

  • @MarkTolonen:我把它作为练习留给读者,但足够公平!
  • 谢谢你,第一个 - 我不能使用 malloc 因为那是 excersize 的要求。第二-谢谢你可能会使用第一种方法,只是在结构或主函数中预先设置一个固定大小的数组。
  • 方法 1 是否将数组保存在堆栈中,并仅将指针传回?
猜你喜欢
  • 2021-02-04
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
相关资源
最近更新 更多