Nullen Sie ein Array in C-Code [duplicate]

Lesezeit: 3 Minuten

Batmans Benutzeravatar
Batman

Mögliche Duplikate:

Wie initialisiert man ein Array mit etwas in C ohne Schleife?
So initialisieren Sie ein Array in C

Wie kann ich eine bekannte Größe eines Arrays auf Null setzen, ohne eine for oder eine andere Schleife zu verwenden?

Zum Beispiel:

arr[20] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

Das ist der lange Weg … Ich brauche den kurzen Weg.

  • auch stackoverflow.com/questions/201101/…

    – tobyodavies

    12. April 2011 um 13:46 Uhr

  • Dein “Beispiel” macht nicht das, was du denkst.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    12. April 2011 um 13:49 Uhr


  • Der von Ihnen gepostete Code ist kein gültiges C. Versuchen Sie, etwas zu posten, das kompiliert wird.

    – Ludin

    12. April 2011 um 14:27 Uhr

Benutzeravatar von Prasoon Saurav
Prasun Saurav

int arr[20] = {0};

C99 [$6.7.8/21]

Wenn eine in geschweiften Klammern eingeschlossene Liste weniger Initialisierer enthält als Elemente oder Mitglieder eines Aggregats vorhanden sind oder weniger Zeichen in einem Zeichenfolgenliteral verwendet werden, um ein Array bekannter Größe zu initialisieren, als Elemente im Array vorhanden sind, der Rest des Aggregats wird implizit genauso initialisiert wie Objekte mit statischer Speicherdauer.


  • Funktioniert dies auch zum Zurücksetzen, nicht zum Initialisieren des Arrays?

    – ma11hew28

    26. April 2014 um 20:24 Uhr

  • Warum nicht einfach int arr[20] = {}; ohne das 0?

    – Stefan Pochmann

    10. Mai 2016 um 13:41 Uhr

  • @StefanPochmann weil es C ist, nicht C++.

    – Weihang Jian

    23. September 2017 um 4:42 Uhr

  • @PrasoonSaurav Schön, aber ich denke, es funktioniert nicht für dynamische Arrays

    – aderchox

    5. Januar 2019 um 16:41 Uhr


  • Ich denke, das macht nicht klar, dass es das Element in den Klammern nicht kopiert. So float control[16] = {15.0}; ist kein Array mit 15.0 16 mal kopiert, ist aber eins 15.0und der Rest ist 0.

    – David Sullivan

    24. September 2020 um 10:35 Uhr


Benutzeravatar von Oleh Prypin
Oleh Pripin

int arr[20];
memset(arr, 0, sizeof arr);

Siehe die Referenz für memset

  • Das kann falsch sein. Du solltest entweder schreiben sizeof arr oder 20 * sizeof (int)

    Benutzer297171

    21. Juni 2013 um 9:01 Uhr

  • Ich war zuerst verwirrt, aber dann erinnerte ich mich: “Wenn ein Typname verwendet wird, muss er immer in Klammern eingeschlossen werden, während Ausdrücke mit oder ohne Klammern angegeben werden können” (de.wikipedia.org/wiki/Sizeof)

    – taz

    20. August 2014 um 4:34 Uhr


  • @BarafuAlbino Wie kann sizeof(arr) falsch sein?

    – Jagdisch

    19. Juli 2015 um 11:59 Uhr

  • Könnte es auch für Nicht-Null-Werte verwendet werden? Ich habe es versucht und es scheint nicht so.

    – aderchox

    5. Januar 2019 um 16:55 Uhr

Hinweis: Sie können memset mit jedem Zeichen verwenden.

Beispiel:

int arr[20];
memset(arr, 'A', sizeof(arr));

Könnte auch teilweise gefüllt sein

int arr[20];
memset(&arr[5], 0, 10);

Aber seien Sie vorsichtig. Es ist nicht auf die Array-Größe beschränkt, Sie könnten Ihrem Programm leicht schweren Schaden zufügen, indem Sie Folgendes tun:

int arr[20];
memset(arr, 0, 200);

Es wird (unter Windows) und null Speicher nach Ihrem Array funktionieren. Es könnte andere Variablenwerte beschädigen.

  • Dies ist ein perfektes Beispiel für UB (undefiniertes Verhalten). Der Compiler kann tun, was er will, wenn er darauf stößt, was normalerweise bedeutet, dass Dinge kaputt gehen.

    – wizzwizz4

    9. Februar 2017 um 16:47 Uhr

int arr[20] = {0} Am einfachsten wäre es, wenn es nur einmal gemacht werden müsste.

Mann bzero

NAME
   bzero - write zero-valued bytes

SYNOPSIS
   #include <strings.h>

   void bzero(void *s, size_t n);

DESCRIPTION
   The  bzero()  function sets the first n bytes of the byte area starting
   at s to zero (bytes containing '\0').

  • -1 etwas mehr Text aus der Manpage: … Diese Funktion ist veraltet (in POSIX.1-2001 als LEGACY markiert): Verwenden Sie memset(3) in neuen Programmen. …

    – pmg

    12. April 2011 um 13:45 Uhr


  • In der C-Sprache gibt es keinen Header namens strings.h. Es ist eine (unnötige/sinnlose) nicht standardmäßige Compiler-Erweiterung.

    – Ludin

    12. April 2011 um 14:28 Uhr

Benutzeravatar von iRaivis
iRaivis

Verwenden memset:

int something[20];
memset(something, 0, 20 * sizeof(int));

  • -1 etwas mehr Text aus der Manpage: … Diese Funktion ist veraltet (in POSIX.1-2001 als LEGACY markiert): Verwenden Sie memset(3) in neuen Programmen. …

    – pmg

    12. April 2011 um 13:45 Uhr


  • In der C-Sprache gibt es keinen Header namens strings.h. Es ist eine (unnötige/sinnlose) nicht standardmäßige Compiler-Erweiterung.

    – Ludin

    12. April 2011 um 14:28 Uhr

1412090cookie-checkNullen Sie ein Array in C-Code [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy