Überschüssige Elemente in Skalar-Initialisierer-Warnung in C

Suraj P 12 Oktober 2023
Überschüssige Elemente in Skalar-Initialisierer-Warnung in C

Bei der Arbeit mit C kann eine Warnungsmeldung auftreten, die besagt: “Überflüssige Elemente in skalarem Initialisierer”. Diese Warnung tritt auf, wenn wir das Array mit zu vielen Elementen initialisieren.

In diesem Leitfaden gehen wir auf die Details dieser Warnung ein und zeigen, wie sie behoben werden kann.

Lösung der Warnmeldung “Überflüssige Elemente in skalarem Initialisierer” in C

Beispielcode 1:

#include <stdio.h>

int main(void) {
  int array[2][3][4] = {
      {{11, 22, 33}, {44, 55, 66}, {0, 0, 0}},
      {{161, 102, 13}, {104, 15, 16}, {107, 18, 19}},
      {{100, 20, 30, 400}, {500, 60, 70, 80}, {960, 100, 110, 120}}};

  // Your code here

  return 0;
}

Ausgabe:

In function 'main':
[Warning] excess elements in array initializer
[Warning] (near initialization for 'array')

Der obige Fehler tritt auf, weil das Deklarat ist int[2][3][4], aber wir versuchen, es so zu initialisieren, als wäre es ein int[3][3][4].

Um diesen Fehler zu beheben, müssen wir die Größe des Arrays korrigieren.

Korrigierter Code (Beispiel 1):

#include <stdio.h>

int main(void) {
  int array[3][3][4] = {
      {{11, 22, 33}, {44, 55, 66}, {0, 0, 0, 0}},
      {{161, 102, 13}, {104, 15, 16}, {107, 18, 19, 0}},
      {{100, 20, 30, 400}, {500, 60, 70, 80}, {960, 100, 110, 120}}};

  // Your code here

  return 0;
}

Schauen wir uns ein weiteres Beispiel an.

Beispielcode 2:

#include <stdio.h>

int main(void) {
  static char(*check)[13] = {
      {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13},
      {11, 22, 33, 44, 55, 66, 77, 88, 99, 100, 110, 120, 130}};

  // Your code here

  return 0;
}

Wir erhalten auch hier die gleiche Warnung; der Compiler gibt die Warnung aus, weil wir zwei Zeiger übergeben haben, aber nur ein einzelner Zeiger auf ein Array mit 13 Elementen existiert. Es sind mehr Elemente als notwendig deklariert.

Wir können dies auf zwei Arten lösen.

Korrigierter Code 1 (Beispiel 2):

#include <stdio.h>

int main(void) {
  // Define two character arrays
  char ar1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
  char ar2[] = {11, 22, 33, 44, 55, 66, 77, 88, 99, 100, 110, 120, 130};

  // Create an array of character pointers and initialize it with the addresses
  // of ar1 and ar2
  char *check[] = {ar1, ar2};

  // Print the elements in ar1
  printf("ar1: ");
  for (int i = 0; i < sizeof(ar1) / sizeof(ar1[0]); i++) {
    printf("%d ", ar1[i]);
  }
  printf("\n");

  // Print the elements in ar2
  printf("ar2: ");
  for (int i = 0; i < sizeof(ar2) / sizeof(ar2[0]); i++) {
    printf("%d ", ar2[i]);
  }
  printf("\n");

  // Print the elements using the check array of pointers
  printf("check[0]: ");
  for (int i = 0; i < sizeof(ar1) / sizeof(ar1[0]); i++) {
    printf("%d ", check[0][i]);
  }
  printf("\n");

  printf("check[1]: ");
  for (int i = 0; i < sizeof(ar2) / sizeof(ar2[0]); i++) {
    printf("%d ", check[1][i]);
  }
  printf("\n");

  return 0;
}

Ausgabe:

ar1: 1 2 3 4 5 6 7 8 9 10 11 12 13 
ar2: 11 22 33 44 55 66 77 88 99 100 110 120 130 
check[0]: 1 2 3 4 5 6 7 8 9 10 11 12 13 
check[1]: 11 22 33 44 55 66 77 88 99 100 110 120 130

Korrigierter Code 2 (Beispiel 2): Wir haben nur einen Array-Zeiger. Der Zeiger zeigt auf ein Array mit 10 Elementen. Wir können den Array-Zeiger inkrementieren, um die nächsten 10 Elemente zu erfassen.

#include <stdio.h>

int main(void) {
  char(*check)[10] = (char[][10]){{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
                                  {0, 31, 29, 31, 30, 31, 30, 31, 31, 30}};

  // Print the elements in the first sub-array
  printf("check[0]: ");
  for (int i = 0; i < 10; i++) {
    printf("%d ", check[0][i]);
  }
  printf("\n");

  // Print the elements in the second sub-array
  printf("check[1]: ");
  for (int i = 0; i < 10; i++) {
    printf("%d ", check[1][i]);
  }
  printf("\n");

  return 0;
}

Ausgabe:

check[0]: 1 2 3 4 5 6 7 8 9 10 
check[1]: 0 31 29 31 30 31 30 31 31 30
Autor: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub