Ü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