C 語言中標量初始化器的過量元素警告

Suraj P 2023年10月12日
C 語言中標量初始化器的過量元素警告

在處理 C 語言時,你可能會遇到一個警告訊息,顯示excess elements in scalar initializer。這個警告訊息是指在初始化陣列時,有太多的元素。

在本指南中,我們將深入研究這個警告訊息以及如何解決它。

在 C 語言中解決警告訊息scalar initializer 中存在多餘的元素

範例程式碼 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;
}

輸出結果:

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

上述錯誤是因為宣告的陣列是 int[2][3][4],但我們嘗試將其初始化為 int[3][3][4] 的陣列。

要解決這個錯誤,我們必須修正陣列的大小。

修正後的程式碼(範例 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;
}

再來看另一個範例。

範例程式碼 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;
}

我們也會得到相同的警告;這是因為我們傳遞了兩個指標,但只有一個指向包含 13 個元素的陣列的單一指標。聲明了比實際需要更多的元素。

我們可以以兩種方式解決這個問題。

修正後的程式碼 1(範例 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;
}

輸出結果:

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

修正後的程式碼 2(範例 2):我們只有一個陣列指標。指標指向一個包含 10 個元素的陣列,我們可以增加指標以取得下一組 10 個元素。

#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;
}

輸出結果:

check[0]: 1 2 3 4 5 6 7 8 9 10
check[1]: 0 31 29 31 30 31 30 31 31 30
作者: 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