Erstellen Sie eine struct auf dem heap?
Habe ich angewiesen worden, schreiben ein Modell strdup durch die Schaffung eines String struct auf dem heap enthält eine Kopie von der Quelle. Ich denke, ich habe erfolgreich kodiert, strdup, aber ich bin mir nicht sicher, ob ich angelegt habe eine Struct auf dem heap...
typedef
struct String {
int length;
int capacity;
unsigned check;
char ptr[0];
} String;
char* modelstrdup(char* src){
int capacity =0, length=0, i = 0 ;
char *string;
while ( src[length] != '\0'){
length++;
}
capacity = length;
string = malloc(sizeof(String) + capacity + 1);
while ( i < length ){
string[i] = src[i];
i++;
}
string[i+1] = '\0';
return string;
}
Siehe stackoverflow.com/questions/1622416/create-strdup-in-c weitere Informationen zu dieser Frage.
Die Verwendung von strlen() eher als schreiben Sie Ihre eigene Schleife, um die Länge.
Die Verwendung von strlen() eher als schreiben Sie Ihre eigene Schleife, um die Länge.
InformationsquelleAutor user133466 | 2009-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie haben ein struct auf dem heap. Sie haben nicht aufgefüllt, es richtig, und du wirst Probleme haben ihn zu löschen - ich bin mir nicht sicher, ob die Hausaufgaben abgedeckt ist oder nicht. So wie es da steht, du bist mehr wahrscheinlich, um Speicherbeschädigung oder, wenn Sie Glück haben, ein Speicher-Leck, als Sie zu release einen dieser strings.
Code, der funktioniert mit standard C89 und C99
Dein code, etwas nach oben korrigiert...
Dieser code funktioniert in C89 sowie C99 - (außer für die C99/C++ - Kommentare). Sie können wahrscheinlich optimieren Sie die Arbeit mit der Struktur 'struct hack' (speichert einen Zeiger in der Struktur - aber nur, wenn Sie einen C99-compiler). Die Geltendmachung sub-optimale Fehlerbehandlung. Den code nicht, sich selbst zu verteidigen gegen einen null-Zeiger für die Eingabe. In diesem Kontext weder die Länge noch die Kapazität bietet jeder nutzen - muss es andere Funktionen in der suite, wird in der Lage sein, um machen Sie Gebrauch von dieser information.
Wie bereits angedeutet, wirst du Probleme haben, löschen Sie die Zeichenfolge-Struktur, wenn der Wert, der zurückgegeben wird, nicht ein Zeiger auf die Zeichenfolge. Sie haben eine filigrane Zeiger Anpassungen zu machen.
Code, der funktioniert mit den standard C99 nur
In C99", Abschnitt 6.7.2.1 Absatz 16 beschrieben, "flexible array members":
Ist mit einem "flexible array member", Ihr code könnte:
Dieser code wurde angenommen, da Sie sauber von GCC 4.0.1 abgesehen von einer Erklärung für die Funktion (Optionen
-Wall -Wextra
). Der Vorherige code muss ein cast auf "String *string = (String *)Raum:" sagen Sie dem compiler, den ich meinte, was ich sagte; ich habe jetzt behoben, und einen Kommentar hinterlassen, um zu zeigen das original.Mit der Verwendung von 'struct hack'
Bevor C99, die Menschen oft verwendet die 'struct hack' um dies zu umgehen. Es ist sehr ähnlich wie der code in der Frage, außer die dimension des Arrays ist 1, nicht 0. Standard-C nicht erlaubt array-Abmessungen die Größe null hat.
- Code, verwendet GCC nicht-standard-Erweiterung zu C89 und C99
Die zero-size array-Schreibweise akzeptiert, GCC, es sei denn, Sie stecken es schwer - geben Sie den ISO C standard und Anforderung pedantische Genauigkeit. Dieser code, deshalb kompiliert OK, es sei denn, Sie verwenden
gcc -Wall -Wextra -std=c99 -pedantic
:Sollten Sie jedoch nicht ausgebildet, die in nicht-standard-Erweiterungen der C-Sprache, bevor Sie ein gründliches Verständnis der Grundlagen von standard-C. Das ist einfach unfair für Sie; Sie können nicht sagen, ob das, was Sie wird gesagt, zu tun, ist sinnvoll, aber Ihre Tutoren sollten nicht irreführend Sie, indem Sie zu zwingen, zu nutzen nicht-standard-Sachen. Auch wenn Sie alarmiert Sie der Tatsache, dass es ist nicht-standard, es ist nicht fair zu Ihnen. C ist schon schwer genug zu lernen, ohne lernen tricksy Zeug, das ist etwas compiler-spezifisch.
ist genau das gleiche wie
(*a).b
. Es ist nur ein Kürzel, das liest sich besser und braucht nicht so viele Klammern.(*ptr).member
<===>ptr->member
. Ich sah, dass der Mangel an Verständnis in der x-ref-würde Frage. Sie müssen sich daran gewöhnen, wenn Sie wollen, zu schreiben idiomatische C oder C++.x-ref würde, wäre die Frage...? sorry, ich bin sehr neu in der Programmierung. Ich bin dabei Einführung in die Programmiersprache C zum ersten mal =)
Ja - ich stellte fest, dass in meinem letzten Zugabe (ohne Befestigung).
InformationsquelleAutor Jonathan Leffler
Haben Sie reserviert Speicher auf dem heap, aber Sie Sie nicht verwenden, als wäre es Ihre Struktur. Die
string
variable der Funktion ist vom Typchar *
nicht der Typstruct String
. Ich glaube, du bist duplizieren die Funktionalität derstrdup()
vernünftig genug, aber ich verstehe nicht den Grund für die Struktur.Hinweis: Sie sollten wahrscheinlich überprüfen Sie Ihren Anruf zu
malloc()
für das scheitern, und die Rückgabe entsprechend. Die man-Seite fürstrdup()
sollte genau erklärt, was die Funktion tun soll.InformationsquelleAutor Carl Norum
Haben Sie. Malloc, new, etc. alle verwenden den heap.
new
Sie bedeutete, dass der operator in C++, Nein, tut es nicht. Es nutzt die "freie Speicher", die möglicherweise das gleiche wie C-heap, oder vielleicht völlig unabhängig. Leider, Computer sind dumm und verlangen Präzision.InformationsquelleAutor popester
Ja,
malloc
gibt Speicher auf dem heap.InformationsquelleAutor bdonlan