4

私の質問は、C ポインターのトピックに言及しています。次のシナリオを想像してください: 次のように定義された「stc」という名前の構造体変数があります。

struct stc {
       int data;
       char ch;
}

プログラムの Main() 関数の先頭で宣言されています。関数を使用して構造体 (つまりdata )のフィールドに値を設定したいと思います。

さて、私の質問は、次の規則のどれが優れているか、そしてその理由は何ですか?

規則 1: stc 型のポインターを返す関数を作成します。

struct stc *func(int d, char c)
{
    stc *tmp = malloc(sizeof(stc))
    tmp -> data = d;
    tmp -> ch = c;

    return tmp;
}

後で構造体が不要になったときに、割り当てられたメモリを解放します。

規則 2:構造体へのポインターを受け取り、stc のアドレスを送信する関数を作成する

void func(stc *stcP, int d, char c)
{
     stcP -> data = d;
     stcP -> ch = c;
}

どうもありがとう!

4

3 に答える 3

5

最初の使用では、注意を怠るとメモリ リークが発生する可能性があります。

2 番目の使用法の方が優れていますが、矢印演算子の使い方が間違っている場合は、次のようにする必要があります。

void func(stc *stcP, int d, char c)
{
    stcP -> data = d;
    stcP -> ch = c;
}
于 2013-09-05T12:07:23.153 に答える
4

私は両方、またはその変形を持っています:

typedef struct stc stc;


#define STC_INITIALIZER(D, C) { .data = d, .ch = c, }

stc* stc_init(stc *stcP, int d, char c) {
  if (stcP) {
     *stcP = (stc)STC_INITIALIZER(d, c);  // Initialize with a compound literal
  }
  return stcP;
}

stc* stc_allocate(int d, char c) {
  return stc_init(malloc(sizeof(stc)), d, c);
}

initしたがって、これには、他の変数と同じ関数をmalloced オブジェクトに使用できるという利点があります。

また、コードにエラーがあったことに注意してください.Cでは、事前にエラーがstcないstruct限り使用できません。typedef

于 2013-09-05T12:20:20.183 に答える