C Verständisfrage objekt kopie
-
Hallo Leute,
und zwar folgendes. Ich habe einen string "StringA"
typedef char sStringA_t[50]; const sStringA_t a = "2323"; sStringA_t b = { 0 }; b = a; //Geht nicht. änderbare LValue nötig was klar.
wenn ich aber den string in ein struct verpacke:
typedef struct sStringB_t { char s[50]; }sStringB_t; sStringB_t a = { "232323" }; sStringB_t b = { 0 }; b = a; //Geht
nun das ist mir nicht "ganz" klar... was der compiler da macht...
Im Ersten Fall ist der string ein Pointer auf ein speicher bereich von 50 chars und muss da memcpy bzw. strcpy machen.
Aber im zweiten fall ist das ja ein objekt aufm stack, und der compiler macht dann bei der Zuweisung eine impliziertes memcpy?
-
Das hast du dir korrekt erschlossen.
Wobei man vielleicht noch nachtragen sollte, dass das Speicherlayout bei beiden identisch ist. Die Unterschiede sind syntaktischer Art, wie ein Array und ein Struct von der Grammatik von C her unterschiedlich benutzt werden.
-
@SeppJ sagte in C Verständisfrage objekt kopie:
Wobei man vielleicht noch nachtragen sollte, dass das Speicherlayout bei beiden identisch ist. Die Unterschiede sind syntaktischer Art, wie ein Array und ein Struct von der Grammatik von C her unterschiedlich benutzt werden.
Danke für deine Antwort.
Wenn das Speicherlayout das selbst ist, wieso wird dann bei array copy keine implizites memcpy gemacht?
-
@SoIntMan sagte in C Verständisfrage objekt kopie:
Wenn das Speicherlayout das selbst ist, wieso wird dann bei array copy keine implizites memcpy gemacht?
Weil die Regeln von C das so sagen
Die Idee dahinter ist wahrscheinlich, dass man ein Array nicht eben einfach so unabsichtlich kopieren will, sondern dass das eine spezielle Sonderaktion sein sollte, die man speziell auslösen muss. Dann ist es gut, wenn man das, was man meistens will, das ist, was einfacher zu schreiben ist.
Das ist natürlich ein Design, dass schon unzählige Anfänger zu Fehlern getrieben hat, aber die Sprache richtet sich halt an Profis, die genau wissen, was sie tun.
-
@SeppJ sagte in C Verständisfrage objekt kopie:
aber die Sprache richtet sich halt an Profis, die genau wissen, was sie tun.
Dieses Argument finde ich immer etwas schwach, weil auch Profis Fehler machen. Ja, man möchte natürlich die Möglichkeit haben, ganz genau bestimmen zu können, was passieren soll - aber man möchte auch möglichst wenig Überraschungen haben. Und die andere Frage ist: C ist schon recht alt. Hat man damals, als man diese Regeln so bestimmt hat, wirklich gedacht "Lass mal ne Sprache für Profis machen" oder ist das nicht eher nachträglich rangedichtet - wollte man damals nicht eher eine Hochsprache haben, die Dinge vereinfacht?
Bis auf diesen Halbsatz stimme ich dir ansonsten zu.