web-dev-qa-db-ja.com

構造体の文字配列-互換性のない割り当て?

構造体が実際に「何」であるかを見つけようとして問題にぶつかったので、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);


}

ご協力いただきありがとうございます!

31
Patrick

これは構造体とは関係ありません-Cの配列は代入できません:

char a[20];
a = "foo";   // error

strcpyを使用する必要があります。

strcpy( a, "foo" );

またはあなたのコードで:

strcpy( sara.first, "Sara" );
60
anon

または、動的割り当てを使用することもできます。例:

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);
9
Scott Gardner

strncpyを使用して、バッファオーバーフローがないことを確認してください。

char name[]= "whatever_you_want";
strncpy( sara.first, name, sizeof(sara.first)-1 );
sara.first[sizeof(sara.first)-1] = 0;
4
TimW

次のように初期化することもできます:

_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)

3
caf

saraは構造体そのものであり、ポインターではありません(つまり、実際の構造体データが格納されているスタック上の位置を表す変数です)。したがって、*saraは無意味であり、コンパイルされません。

2
Pavel Minaev

この方法で試すことができます。私の場合、これを適用しました。

#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);

}
0
Xofo

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 を確認してください:).

0
gramm