1

私は 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;
}

メモリ割り当てを使用せずにこれを行うにはどうすればよいですか? リファレンスを返すことはできますか? 私はそうは思わない。

助けてくれてありがとう。

4

1 に答える 1

6

安全な方法 (1):

配列メンバーを持つ構造体を定義し、それを返します。

例えば:

struct MyContainer {
    Thing x[42];
};

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

明らかに、コンパイル時に配列サイズが関数に知られていない場合、この方法は不可能です。

安全な方法 (2):

呼び出し元に配列を引数として渡してもらいます。

例えば:

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

安全でない方法:

静的ローカル配列を宣言し、それへのポインターを返します。

これは、静的配列がスコープ外になったときに割り当てが解除されないため、「機能します」。ただし、次に関数を使用するときに配列が上書きされるため、安全ではありません (特にマルチスレッド シナリオでは不適切です)。

このメソッドは、コンパイル時に配列サイズが関数に認識されていない場合にも使用できません。

于 2012-04-06T13:30:07.590 に答える