0

次のような構造体をパラメーターとして受け取る関数があります。

add_new_structure(structure s);

次にそれを中に保管します structure structure_list[200];

質問:

1.構造を使いたいときは、次のような機能があります

structure *getStructure(int id)
{
return &structure_list[id];
}

次のような構造を1つ追加すると、機能しますか?

void init()
{
   structure test;
   memset(&test,0,sizeof(structure));
   add_new_structure(test);
}

次に、別の関数からgetStructureを呼び出しますか?このような:

void anotherFunction()
{
    structure *got_test = getStructure(0);
}

ローカル変数を持って別の関数から呼び出すことができないことを覚えているからですよね?

2.このように保管した方がいいですか?

add_new_structure() parameter to structure *s;を変更します。

次に、 structure *structure_list[200];add_new_structure(&test);を呼び出して内部に保存します。

3.どちらが良いですか?またはそれを行う正しい方法は何ですか?

4

2 に答える 2

0

最初のアプローチ、つまりインスタンスをパラメーターとして直接渡すアプローチが機能します。関数を呼び出すときにインスタンス全体がコピーされるためです。そして、保存するのは元の構造体インスタンスのコピーです。

ただし、ローカル変数へのポインタを渡して格納することはできません。この場合、上記の問題が発生します。

私見、上記のアプローチはどちらも正しくありません。最初のアプローチでは、パラメーターを関数に渡すときにオーバーヘッドが大きくなりすぎます。2番目のものはあなたが望むものを達成することはできませんが。malloc/を使用して動的にメモリを割り当てcalloc、ポインタを配列に格納することをお勧めします。メモリリークが発生した場合に備えて、使用終了時にオブジェクトを解放することを忘れないでください。このような:

void init()
{
   structure *test = NULL;
   test = (structure *) calloc(1, sizeof(structure));
   add_new_structure(test);
}

void add_new_structure(structure *s);
于 2012-10-24T10:50:23.513 に答える
0

ご指摘のとおり、オプション2は機能しません。ローカル変数へのポインターは関数の外では使用できないと言うよりも少し微妙です。それは、いわば、関数がまだ「アクティブ」である間だけ有効であるということです。オプション2では、を呼び出すと、へのポインタがstructure test内部に格納されます。この時点で、を呼び出している関数が呼び出されています。から戻ると、入力したメモリアドレスは元の所有者によって所有されなくなり、これは危険です。これが説明としてあまりにも機械的である場合は、スタックがどのように機能するかを調べて理由を確認する必要があります。structure *structure_list[200]add_new_structureinitadd_new_structureinitstructure_list

とその仲間を使用しないと、多くの複雑さが生じる可能性がありますが、値ではなく参照で渡すことができる小さな変更を加えて、mallocメモリをに保存しておく傾向があります。これはおそらく、2つのスタイルの妥協点です。structure_liststructure test

void init() {
    structure test;
    memset(&test,0,sizeof(structure));
    add_new_structure(&test);
}

void add_new_structure(structure *s) {
    if (structure_count < 200) {
        structure_list[structure_count++] = *s;
    }
}

これの多くは何であるかに依存しstructureます(ポインタ自体が含まれている場合、それらを所有しているのは誰ですか?)が、うまくいけば、これはいくつかの直感を提供します。

于 2012-10-24T11:11:35.327 に答える