wake-up-neo.net

Char Array in einer Struktur - inkompatible Zuweisung?

Ich habe versucht herauszufinden, was ein struct wirklich ist und habe ein Problem gefunden, also habe ich wirklich zwei Fragen:

1) Was wird in 'sara' gespeichert? Ist es ein Zeiger auf das erste Element der struct?

2) Die interessantere Frage: Warum kompiliert es nicht? GCC sagt "test.c: 10: Fehler: inkompatible Typen in Zuweisung" und ich kann nicht herausfinden, warum ...

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


}

Danke für Ihre Hilfe!

31
Patrick

Das hat nichts mit structs zu tun - Arrays in C sind nicht zuweisbar:

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

sie müssen strcpy verwenden:

strcpy( a, "foo" );

oder in deinem Code:

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

Oder Sie können einfach die dynamische Zuordnung verwenden, z.

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

verwenden Sie strncpy, um sicherzustellen, dass Sie keinen Pufferüberlauf haben.

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

Sie können es auch so initialisieren:

struct name sara = { "Sara", "Black" };

Da (als Spezialfall) erlaubt ist, initialize Char-Arrays aus String-Konstanten zu erstellen.

Nun, was eine Struktur eigentlich ist - es ist ein zusammengesetzter Typ, der aus anderen Werten besteht. Wie sara im Speicher aussieht, ist ein Block mit 20 aufeinanderfolgenden Zeichenwerten (auf den mit sara.first gefolgt von 0 oder mehr Auffüllbytes gefolgt von einem weiteren Block mit 20 aufeinanderfolgenden Zeichenwerten (auf den mit sara.last verwiesen werden kann) verwiesen werden Alle anderen Instanzen des Typs struct name sind auf dieselbe Weise angeordnet.

In diesem Fall ist es sehr unwahrscheinlich, dass es ein Auffüllen gibt. Ein struct name ist nur ein Block mit 40 Zeichen, für den Sie einen Namen für die ersten 20 und die letzten 20 haben.

Sie können herausfinden, wie groß ein Speicherblock ist, den ein struct name mit sizeof(struct name) benötigt, und Sie können herausfinden, wo sich innerhalb dieses Speicherblocks jedes Member der Struktur mit offsetof(struct name, first) und offsetof(struct name, last) befindet.

3
caf

sara ist die Struktur selbst, kein Zeiger (d. h. die Variable, die den Ort auf dem Stapel darstellt, an dem tatsächliche Strukturdaten gespeichert sind). Daher ist *sara bedeutungslos und wird nicht kompiliert.

2
Pavel Minaev

Sie können es auf diese Weise versuchen. Ich hatte das in meinem Fall angewandt. 

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

}

Sie können strcpy verwenden, um es aufzufüllen. Sie können es auch von einer anderen Struktur aus initialisieren.

#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

Die Sara-Struktur ist ein Speicherblock, der die darin enthaltenen Variablen enthält. Es gibt fast keinen Unterschied zwischen klassischen Deklarationen:

char first[20];
int age;

und eine Struktur:

struct Person{
char first[20];
int age;
};

In beiden Fällen müssen Sie nur etwas Speicherplatz für die Speicherung von Variablen reservieren. In beiden Fällen sind 20 + 4 Byte reserviert. In Ihrem Fall ist Sara nur ein Speicherblock von 2x20 Bytes. 

Der einzige Unterschied besteht darin, dass bei einer Struktur der Speicher als einzelner Block zugewiesen wird. Wenn Sie also die Startadresse von Sara nehmen und 20 Byte springen, finden Sie die "letzte" Variable. Dies kann manchmal nützlich sein.

prüfen  http://publications.gbdirect.co.uk/c_book/chapter6/structures.html für mehr :) .

0
gramm