構造体が実際に「何」であるかを見つけようとして問題にぶつかったので、2つの質問があります。
1)「サラ」には何が保存されますか?構造体の最初の要素へのポインターですか?
2)より興味深い質問:なぜコンパイルしないのですか? GCCは「test.c:10:error:incompatible types in assignment」と言っていますが、理由はわかりません...
#include <stdio.h>
struct name {
char first[20];
char last[20];
};
int main() {
struct name sara;
sara.first = "Sara";
sara.last = "Black";
printf("struct direct: %x\n",sara);
printf("struct deref: %x\t%s\n", *sara, *sara);
}
ご協力いただきありがとうございます!
これは構造体とは関係ありません-Cの配列は代入できません:
char a[20];
a = "foo"; // error
strcpyを使用する必要があります。
strcpy( a, "foo" );
またはあなたのコードで:
strcpy( sara.first, "Sara" );
または、動的割り当てを使用することもできます。例:
struct name {
char *first;
char *last;
};
struct name sara;
sara.first = "Sara";
sara.last = "Black";
printf("first: %s, last: %s\n", sara.first, sara.last);
strncpy
を使用して、バッファオーバーフローがないことを確認してください。
char name[]= "whatever_you_want";
strncpy( sara.first, name, sizeof(sara.first)-1 );
sara.first[sizeof(sara.first)-1] = 0;
次のように初期化することもできます:
_struct name sara = { "Sara", "Black" };
_
(特殊なケースとして)文字列定数から初期化 char配列が許可されているため。
さて、構造体が実際に何であるかについて-それは他の値で構成される複合型です。 sara
はメモリ内で実際にどのように見えるかは、20個の連続するchar値のブロックです(_sara.first
_を使用して参照できます。 (これは_sara.last
_を使用して参照できます。_struct name
_型の他のすべてのインスタンスは同じ方法でレイアウトされます。
この場合、パディングがある可能性は非常に低いため、_struct name
_は40文字のブロックであり、最初の20と最後の20の名前があります。
_struct name
_がsizeof(struct name)
を使用してどれくらいのメモリブロックを占有するかを調べることができます。また、offsetof(struct name, first)
およびoffsetof(struct name, last)
。
sara
は構造体そのものであり、ポインターではありません(つまり、実際の構造体データが格納されているスタック上の位置を表す変数です)。したがって、*sara
は無意味であり、コンパイルされません。
この方法で試すことができます。私の場合、これを適用しました。
#include<stdio.h>
struct name
{
char first[20];
char last[30];
};
//globally
// struct name sara={"Sara","Black"};
int main()
{
//locally
struct name sara={"Sara","Black"};
printf("%s",sara.first);
printf("%s",sara.last);
}
Strcpyを使用してデータを入力できます。別の構造体から初期化することもできます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct name {
char first[20];
char last[20];
};
int main() {
struct name sara;
struct name other;
strcpy(sara.first,"Sara");
strcpy(sara.last, "Black");
other = sara;
printf("struct: %s\t%s\n", sara.first, sara.last);
printf("other struct: %s\t%s\n", other.first, other.last);
}
Sara構造は、内部に変数を含むメモリブロックです。従来の宣言とほとんど違いはありません:
char first[20];
int age;
および構造:
struct Person{
char first[20];
int age;
};
どちらの場合も、変数を保存するためにメモリを割り当てているだけで、どちらの場合も20 + 4バイトが予約されています。あなたの場合、Saraは2x20バイトの単なるメモリブロックです。
唯一の違いは、構造体では、メモリが単一のブロックとして割り当てられるため、Saraの開始アドレスを取得して20バイトをジャンプすると、「最後の」変数が見つかることです。これは時々役立つことがあります。
http://publications.gbdirect.co.uk/c_book/chapter6/structures.html を確認してください:).