Array mit variabler Länge wird initialisiert [duplicate]

Lesezeit: 3 Minuten

Benutzer-Avatar
hackt

Beim Initialisieren eines Arrays mit variabler Länge gibt der Compiler eine Fehlermeldung aus:

[Error] variable-sized object may not be initialized  

Code-Auszug:

int n; 
printf("Enter size of magic square: ");
scanf("%d",&n);

int board[n][n] = {0};

Wie sollte Arrays mit variabler Länge initialisiert werden? Und warum werden nicht alle Elemente initialisiert 0 wie unten angegeben;

   int board[n][n];
   board[n][n] = {0};

?

Sie müssen verwenden memset:

memset(board, 0, sizeof board);

  • Ich habe keine Ahnung memset().

    – Hacken

    26. Juni 2013 um 23:59 Uhr

  • Was bedeutet das?

    – Karl Norum

    27. Juni 2013 um 0:00 Uhr

  • @hackks du schreibst das einfach unter deine Linie int board[n][n];. Und vergewissere dich #include <string.h>

    – i Code 4 Essen

    27. Juni 2013 um 0:00 Uhr


  • #include <string.h> für C.

    – Karl Norum

    27. Juni 2013 um 0:00 Uhr

  • Sie wollten es initialisieren 0Rechts?

    – Karl Norum

    27. Juni 2013 um 1:26 Uhr

Benutzer-Avatar
AnT steht zu Russland

VLAs können nicht sein initialisiert durch irgendeine Form von Initialisierungssyntax. Sie müssen zuordnen die Anfangswerte für Ihre Array-Elemente nach der Deklaration auf die von Ihnen bevorzugte Weise.

C11: 6.7.9 Initialisierung (p2 und p3):

Kein Initialisierer darf versuchen, einen Wert für ein Objekt bereitzustellen, das nicht in der zu initialisierenden Entität enthalten ist.

Der Typ der zu initialisierenden Entität soll ein Array unbekannter Größe oder ein vollständiger Objekttyp sein das ist kein Array-Typ mit variabler Länge.

  • du meinst zu sagen int board[n][n]; board[n][n] = {0};. Rechts?

    – Hacken

    27. Juni 2013 um 0:05 Uhr


  • @hackks: Nein. Arrays sind nicht zuweisbar. Aus diesem Grund habe ich gesagt: “Weisen Sie Ihrem Array die Anfangswerte zu Elemente“. Abgesehen von solchen Rohspeicheroperationen wie memset oder memcpy, muss dies Element für Element erfolgen. Also, ich wollte damit sagen for (i = 0; i < n; ++i) ... usw.

    – AnT steht zu Russland

    27. Juni 2013 um 0:37 Uhr


  • Ich habe gelesen, dass Array als initialisiert werden kann array[m][n] = {0}dies wird sein erstes Element zu initialisieren 0 und verbleibende Elemente werden initialisiert 0 selbst.

    – Hacken

    27. Juni 2013 um 0:46 Uhr

  • @hackks: “Initialisiert” bedeutet das = { 0 } kann als Initialisierer in einer Deklaration angegeben werden. Was Sie in Ihrem ersten Kommentar haben, ist völlig falsch. Und selbst in einer Deklaration funktioniert es nur mit Nicht-VLA-Arrays. Zum Beispiel können Sie tun int array[10][10] = { 0 }. Diese Frage bezieht sich jedoch speziell auf VLA-Arrays. VLA-Arrays akzeptieren keine Initialisierer. Du kannst nicht tun int array[m][n] = { 0 } Wenn m und n sind keine Konstanten.

    – AnT steht zu Russland

    27. Juni 2013 um 1:59 Uhr


Benutzer-Avatar
Parag Gangil

1. Sie können das Array einfach wie folgt initialisieren:

int n; 
printf("Enter size of magic square: ");
scanf("%d",&n);

int board[n][n];
for(int i=0; i<n; i++)
   for(int j=0; j<n; j++)
   {
      board[i][j] = 0;
   }
}

2. memset() sollte nur verwendet werden, wenn Sie das Array auf “0” setzen möchten.

  • … memset() sollte nur verwendet werden, wenn Sie das Array auf “0” setzen möchten.„Hu! Warum das?

    – alk

    24. Dezember 2013 um 16:42 Uhr


  • @alk: Die memset() Die Funktion füllt die ersten n Bytes des Speicherbereichs, auf den s zeigt, mit dem konstanten Byte c. Während die Größe der Ganzzahl im Allgemeinen 4 Bytes beträgt, können wir die Ganzzahl nicht auf unsere gewünschte Zahl setzen, aber “0” ist ein Sonderfall, da mit “0” memset() setzt alle Bytes auf “0”.

    – Parag Gangil

    26. Dezember 2013 um 7:49 Uhr

  • @ParagGangil; memset() sollte nur verwendet werden, wenn Sie das Array auf “0” setzen möchten: Nicht wahr.

    – Hacken

    10. März 2015 um 19:02 Uhr

1282770cookie-checkArray mit variabler Länge wird initialisiert [duplicate]

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

Privacy policy