Dadurch wird jedoch nur das erste Element auf null gesetzt.
oder
my_custom_data[0] = 0;
anstatt zu verwenden memsetich dachte, die 2 obigen Beispiele sollten alle Daten löschen.
Jared, warum hast du das c++-Tag gesetzt? Er sprach über “C” und fügte keine C++-bezogenen Tags hinzu.
– Johannes Schaub – litb
11. März 2009 um 1:08 Uhr
Dies gilt gleichermaßen für Zeichenarrays in C++, auch wenn er dies nicht spezifiziert hat.
– Adam Hawes
11. März 2009 um 5:37 Uhr
Ich habe das C++-Tag entfernt, um zu vermeiden, was wir bereits bei Leuten gesehen haben, die C++-spezifische Lösungen anbieten
– Alnitak
11. März 2009 um 16:34 Uhr
JaredPar
Es hängt davon ab, wie Sie das Array anzeigen möchten. Wenn Sie das Array als eine Reihe von Zeichen betrachten, können Sie die Daten nur löschen, indem Sie jeden Eintrag berühren. memset ist wahrscheinlich der effektivste Weg, dies zu erreichen.
Wenn Sie sich dagegen dafür entscheiden, dies als C/C++-Zeichenfolge mit Nullterminierung anzuzeigen, wird die Zeichenfolge durch Setzen des ersten Bytes auf 0 effektiv gelöscht.
Das Schlüsselwort in der Antwort ist „effektiv“. Nur das erste Element wird auf 0 gesetzt und der Rest hat noch undefinierte Werte, aber wenn Sie das Array als nullterminierten String behandeln und das erste Element null ist, dann wird der String als leer betrachtet.
– Arnold Spence
11. März 2009 um 1:46 Uhr
in der Tat, das ist die Antwort, Leute.
– Johannes Schaub – litb
11. März 2009 um 1:49 Uhr
@caparcode, genau. Aus diesem Grund ist es sehr wichtig zu verstehen, wie das Array verwendet wird.
– JaredPar
11. März 2009 um 1:49 Uhr
Ja, das hätte ich in meinem ersten Post sagen sollen. Das Zeichen ist eine abgeschlossene Zeichenfolge. entweder diese werden diesen Trick tun. verkohlen[0] = ‘\0’; oder char[0] = 0. Ich bin mir nicht sicher, aber ich habe gehört, dass die Verwendung von ‘\0’ besser für die Verwendung von nullterminierten Zeichenfolgen ist.
– Ameise2009
11. März 2009 um 2:06 Uhr
@robUK, ja, du hast Recht. Technisch gesehen ist ‘\0’ gleich 0 (in ASCII), aber Sie sollten ‘\0’ verwenden, weil es Ihre Absicht klar macht
– Markus Testa
11. März 2009 um 2:23 Uhr
Johannes Feminella
Ein Array in C ist nur ein Speicherplatz, also tatsächlich Ihr my_custom_data[0] = '\0'; Zuweisung setzt einfach das erste Element auf Null und lässt die anderen Elemente intakt.
Wenn Sie alle Elemente des Arrays löschen möchten, müssen Sie jedes Element besuchen. Das ist was memset ist für:
memset(&arr[0], 0, sizeof(arr));
Dies ist im Allgemeinen der schnellste Weg, sich darum zu kümmern. Wenn Sie C++ verwenden können, ziehen Sie stattdessen std::fill in Betracht:
Ich glaube, die zweite Version sollte sein: std::fill( arr, arr+ sizeof(arr)/sizeof(arr[0]), 0 );
– David Rodríguez – Dribeas
11. März 2009 um 0:40 Uhr
Klarstellung: Verwenden Sie sizeof nicht mit fill, da Sie später Probleme mit Arrays von int, long, double oder was auch immer bekommen.
– Zan Luchs
11. März 2009 um 1:08 Uhr
Ich bevorzuge: std::fill(&arr[0]&arr[arr_len]0);
– Zan Luchs
11. März 2009 um 1:10 Uhr
Zan Lynx, das ist undefiniertes Verhalten. du kannst &arr nicht machen[arr_len]. aber Sie müssen std::fill(arr, arr + sizeof arr, 0); oder wenn du irgendwo die Länge hast std::fill(arr, arr + arr_len, 0); unter der Annahme eines Arrays von char
– Johannes Schaub – litb
11. März 2009 um 1:11 Uhr
Es ist nur in C gültig. Obwohl die Frage eindeutig auf C abzielte (ein anderer Typ hat ein C++-Tag hinzugefügt, ich habe keine Ahnung warum), zeigt std::fill C++-Affinität 🙂
– Johannes Schaub – litb
11. März 2009 um 1:12 Uhr
Warum denken Sie, dass das Setzen eines einzelnen Elements das gesamte Array löschen würde? Besonders in C passiert wenig, ohne dass der Programmierer es explizit programmiert. Wenn Sie das erste Element auf Null (oder einen beliebigen Wert) setzen, haben Sie genau das getan, und nicht mehr.
Beim Initialisieren können Sie ein Array auf Null setzen:
char mcd[40] = {0}; /* sets the whole array */
Ansonsten kenne ich keine andere Technik als Memset oder ähnliches.
Ich denke, das hängt von dem Compiler ab, den Sie verwenden
– Kakaofan
11. März 2011 um 7:38 Uhr
@cocoafan: Nein, es ist nicht Compiler-abhängig. Es ist Teil der Sprachspezifikation. Jeder Compiler, der sich anders verhält, folgt nicht der C-Sprache.
– abelenky
12. März 2011 um 4:26 Uhr
Das wusste ich nicht, danke. Ich konnte keine Ressource finden, wo ich diesen Sonderfall lesen kann. Wäre schön, es als Lesezeichen zu haben.
– Kakaofan
13. März 2011 um 7:58 Uhr
Dies wird Teilinitialisierung genannt. Ich habe die C99-Spezifikation nicht, aber hier sind zwei Quellen: bit.ly/enBC2m “Sie müssen nicht alle Elemente in einem Array initialisieren. Wenn ein Array teilweise initialisiert ist, erhalten nicht initialisierte Elemente den Wert 0 des entsprechenden Typs.” bit.ly/f9asHH “Wenn das Array weniger Initialisierer als Elemente enthält, werden die verbleibenden Elemente automatisch auf 0 initialisiert.”
– abelenky
13. März 2011 um 15:14 Uhr
Dies gilt nicht für ein Array, das bereits deklariert und mit Werten belegt wurde, oder?
Jared, warum hast du das c++-Tag gesetzt? Er sprach über “C” und fügte keine C++-bezogenen Tags hinzu.
– Johannes Schaub – litb
11. März 2009 um 1:08 Uhr
Dies gilt gleichermaßen für Zeichenarrays in C++, auch wenn er dies nicht spezifiziert hat.
– Adam Hawes
11. März 2009 um 5:37 Uhr
Ich habe das C++-Tag entfernt, um zu vermeiden, was wir bereits bei Leuten gesehen haben, die C++-spezifische Lösungen anbieten
– Alnitak
11. März 2009 um 16:34 Uhr