2013-07-10 67 views
8

のためのメモリ割り当てと仮定し、次のコード:C構造体、ポインタおよびフィールド

struct c { 
    char* name; 
}; 

int main(int argc, char *argv[]) { 
    struct c c1; 
    c1.name = "Ana"; 
    printf ("%s\n",c1.name); 
    return 0; 
} 

私の最初の反応は、ヒープ上、または明示的なchar name[] = "Anna"のいずれかによって、私はいくつかの領域を割り当てるために必要なことを考えるようになっているだろうしかし、上記の私の例はうまくいきます。コンパイラはその文字列をデータセグメントに格納してそれを指し示していますか?言い換えれば、そうすることですか?

struct c { 
    char* name = "Ana"; 
}; 

ありがとうございました。

答えて

8
struct c c1; 
c1.name = "Ana"; 

あなたはリテラルと文字列リテラルは、静的記憶域期間を持つ文字列へのポインタc1.nameポイントを作っているので、ここではメモリを割り当てる必要はありません。リテラルスティングを格納するために割り当てられ、次いで"Anna"リテラル文字列はがアレイnameコピーされているので、この場合メモリに

char name[] = "Anna"; 

:これはに類似していません。あなたは、構造体の割り当てc1.name = "Ana"でやっていることはあなたが行うときのようになります。

char *name = "Anna"; 

すなわちリテラル文字列へのポインタのポイントを作ります。

+1

実際に質問に答えるために+1 –

+2

申し訳ありません、私はそれを得ると思います。これがあなたの「静的記憶期間」であることを明確にしたのは、実際にはコンパイル時にデータセグメントにあることを意味し、コンパイラはどこを指し示すのかを明確に知っています。ありがとう。 –

3

私はCのが、私は、これはprintf("%s\n", cThing);が、その後、「物事を!」印刷し、あなたが構造体にポインタを宣言している以外

char *cThing; 
cThing = "Things!"; 

としてだけで同じことができると思い何から新しいです。

+1

私はあなたに勝利ポイントを与えています:)私はあなたが直感を持っていて驚くべきことを見つけ、それを伝えるために良い簡単な例を使用しました。よくやった :) –

関連する問題