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!
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" );
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);
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;
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.
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.
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);
}
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 :) .