Ich weiß, dass wir in C kein Array von einer Funktion zurückgeben können, sondern einen Zeiger auf ein Array. Aber ich möchte wissen, was das Besondere daran ist structs
, dass sie von Funktionen zurückgegeben werden können, obwohl sie möglicherweise Arrays enthalten.
Warum macht das struct
Wrapping das folgende Programm gültig?
#include <stdio.h>
struct data {
char buf[256];
};
struct data Foo(const char *buf);
int main(void)
{
struct data obj;
obj = Foo("This is a sentence.");
printf("%s\n", obj.buf);
return 0;
}
struct data Foo(const char *buf)
{
struct data X;
strcpy(X.buf, buf);
return X;
}
union
. Was ist das Besondere an Gewerkschaften?memcpy()
und der Verlust des 'versteckten' Speichers sind der Hauptgrund dafür, dass eine Strukturpassed to
wederreturned from
eine Funktion noch eine Funktion sein sollte. Am besten übergeben Sie einen Zeiger auf die Struktur.Antworten:
Eine bessere Möglichkeit, dieselbe Frage zu stellen, wäre "Was ist das Besondere an Arrays?", Denn es sind die Arrays, denen eine spezielle Behandlung zugeordnet ist, nicht
struct
s.Das Verhalten beim Übergeben und Zurückgeben von Arrays per Zeiger geht auf die ursprüngliche Implementierung von C zurück. Arrays "zerfallen" in Zeiger, was zu großer Verwirrung führt, insbesondere bei Personen, die neu in der Sprache sind. Strukturen hingegen verhalten sich wie integrierte Typen wie
int
s,double
s usw. Dies schließt alle in die eingebetteten Arrays einstruct
, mit Ausnahme von flexiblen Array-Elementen , die nicht kopiert werden.quelle
struct
es nicht möglich war, s als Wert zu übergeben?struct Point {short x, y, z;};
. Sie möchten wirklich Zeiger verwenden, um sie zu verschieben? Auf diese Weise sparen Sie sicherlich keinen Platz.Zunächst, um zu zitieren
C11
, Kapitel §6.8.6.4,return
Aussage, ( Hervorhebung von mir )Die Rückgabe einer Strukturvariablen ist möglich (und korrekt), da der Strukturwert zurückgegeben wird. Dies ähnelt der Rückgabe eines primitiven Datentyps (
int
z. B. Rückgabe ).Wenn Sie andererseits ein Array zurückgeben , indem Sie das verwenden
return <array_name>
, wird im Wesentlichen die Adresse des ersten Elements des Arrays zurückgegeben. HINWEIS , das im Aufrufer ungültig wird, wenn das Array für die aufgerufenen Funktionen lokal war. Eine Rückgabe des Arrays auf diese Weise ist daher nicht möglich.Also, TL; DR , es gibt nichts Besonderes mit
struct
s, die Spezialität liegt in Arrays .HINWEIS:
Nochmals zitieren
C11
, Kapitel §6.3.2.1, ( meine Betonung )quelle
struct
Typen haben nichts Besonderes ; Array- Typen haben etwas Besonderes , das verhindert, dass sie direkt von einer Funktion zurückgegeben werden.Ein
struct
Ausdruck wird wie ein Ausdruck eines anderen Nicht-Array-Typs behandelt. es ergibt den Wert desstruct
. So können Sie Dinge wie tunDer Ausdruck ergibt
someFoo
den Wert desstruct foo
Objekts. Der Inhalt des Objekts wird von der Funktion zurückgegeben (auch wenn dieser Inhalt Arrays enthält).Ein Array-Ausdruck wird anders behandelt. Wenn es sich nicht um den Operanden der
sizeof
oder unären&
Operatoren handelt oder wenn es sich nicht um ein Zeichenfolgenliteral handelt, das zum Initialisieren eines anderen Arrays in einer Deklaration verwendet wird, wird der Ausdruck vom Typ "Array vonT
" in "Zeiger aufT
" konvertiert ("decays"). und der Wert des Ausdrucks ist die Adresse des ersten Elements.Sie können also kein Array nach Wert von einer Funktion zurückgeben, da jeder Verweis auf einen Array-Ausdruck automatisch in einen Zeigerwert konvertiert wird.
quelle
Strukturen haben standardmäßig öffentliche Datenelemente, so dass es bei Strukturen möglich ist, auf Daten in main zuzugreifen, nicht jedoch in Klassen. Der Strukturumbruch ist also gültig.
quelle
public
/private
Unterscheidung und es gibt keineclass
es. Die Frage ist, warum astruct
in C benötigt wird, um den Wert eines Arrays zurückzugeben.