1

構造体とポインタについていくつか質問があります

この構造体の場合:

typedef struct tNode_t {
    char *w;
} tNode;

t.w = "asdfsd"の代わりに使用する必要がある *w の値を変更/知りたい場合はどうすればよいt->w = "asdfasd"ですか?

そして、テストコードを使用せずにこれを正常にコンパイルしましたt.w = (char *) malloc(28*sizeof(char)); .ttが必要ない理由はありますか?

サンプルメイン:

int main()
{
    tNode t;
    char w[] = "abcd";
    //t.word = (char *) malloc(28*sizeof(char));
    t.word = w;
    printf("%s", t.word);
}

ありがとう。

4

4 に答える 4

2

t->wは省略形です。つまり、 が構造体へのポインターである(*t).w場合にのみ、矢印を使用する意味があります。t

また、割り当てた文字列はハードコードされているため (コンパイル時に決定されるため)、実行時に動的にメモリを割り当てる必要はありません。

于 2012-12-02T05:00:59.043 に答える
0

このチュートリアルをご覧ください: http://pw1.netcom.com/~tjensen/ptr/ch5x.htm

struct tag {
char lname[20];      /* last name */
char fname[20];      /* first name */
int age;             /* age */
float rate;          /* e.g. 12.75 per hour */
};

これで、ポインターが struct タグを使用して宣言された構造体を指すことがわかりました。そのようなポインタを次の宣言で宣言します。

struct tag *st_ptr;

そして、それを次の例の構造に向けます。

st_ptr = &my_struct;

これで、ポインターを逆参照することで、特定のメンバーにアクセスできます。しかし、構造体へのポインターを逆参照するにはどうすればよいでしょうか。さて、ポインターを使用して従業員の年齢を設定したいという事実を考えてみましょう。次のように書きます。

(*st_ptr).age = 63;

これをよく見てください。かっこ内を st_ptr が指している構造体 my_struct に置き換えます。したがって、これは my_struct.age と同じになります。

ただし、これはかなり頻繁に使用される式であり、C の設計者は同じ意味を持つ別の構文を作成しました。

st_ptr->age = 63;
于 2012-12-02T05:00:46.373 に答える
0

*w の値を変更/知りたい場合、t->w = "asdfasd" の代わりに tw = "asdfsd" を使用する必要があるのはなぜですか?

tがポインターの場合は、 を使用する必要がありますt->w。それ以外の場合は、を使用する必要がありますt.w

私のテスト コードでは、tt が必要ない理由はありますか?

あなたのコードではt.wordchar w[] = "abcd";. mallocそのため、メモリを必要としませんt.word

必要な別の例mallocは次のとおりです。

tNode t;
t.word = (char *) malloc(28*sizeof(char));
strcpy(t.word, "Hello World");
printf("%s", t.word);
于 2012-12-02T05:00:49.950 に答える
0

*w の値を変更/知りたい場合、t->w = "asdfasd" の代わりに tw = "asdfsd" を使用する必要があるのはなぜですか?

tは でありtNode、 へのポインタではないtNodeため.、適切なアクセサです。

そして、これを tw = (char *) malloc(28*sizeof(char)); なしで正常にコンパイルしました。私のテスト コードでは、tt が必要ない理由はありますか?

これは"abcd"まだスコープ内にあり、wそれを指すだけなので必要ありません。永続的なメモリ管理コンテンツを指す場合wは、この行のように独自のメモリを割り当てる必要があります。

于 2012-12-02T05:00:54.220 に答える