如何在不使用malloc的情况下从函数返回数组?

时间:2012-04-06 13:28:01

标签: c arrays memory pointers return

我一直在努力处理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;
}

现在如何在不使用内存分配的情况下执行此操作?我可以退回参考吗?我不这么认为。

感谢任何人的帮助。

1 个答案:

答案 0 :(得分:6)

安全方法(1):

使用数组成员定义结构,然后返回该结构。

e.g:

struct MyContainer {
    Thing x[42];
};

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

显然,如果在编译时函数不知道数组大小,则无法使用此方法。

安全方法(2):

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

e.g:

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

不安全的方法:

声明一个静态本地数组,并返回指向该数组的指针。

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

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