簡體   English   中英

使用變量初始化二維數組的數組初始值設定項中的多余元素

[英]Excess elements in array initializer initializing 2D array using variable

我正在嘗試將數組 N[][] 的所有值初始化為 0,但我在數組初始值設定項中得到了多余的元素

int M = 5;
int N[5][M] = {0}

您需要手動初始化 VLA 陣列。

如果你想歸零它使用 memset 就像我的例子一樣。 如果你想要更復雜的東西,你需要編寫自己的代碼來做到這一點。


int init(void *array, size_t size, int *initializer, size_t isize)
{
    unsigned char *wrk = array;
    if(initializer)
    {
        memcpy(wrk, initializer, isize);
    }
    else
    {
        isize = 0;
    }
    memset(wrk + isize, 0, size - isize);
    return array;
}

int main() 
    {
    int M = 5;
    int Z = 5;
    int N[Z][M];

    memset((void *)N, 0, sizeof(N));

    for (int i = 0; i < Z; i++)
    {
        for (int j = 0; j < M; j++)
            printf("%d ", N[i][j]);
        printf("\n");
    }

    printf("\n");

    init(N, sizeof(N), (int[]){1,2,3,4}, sizeof(int) * 4);

    for (int i = 0; i < Z; i++)
    {
        for (int j = 0; j < M; j++)
            printf("%d ", N[i][j]);
        printf("\n");
    }
}

啟用-pedantic標志,您將收到編譯器警告:

main.c: In function 'main':
main.c:5:3: error: variable-sized object may not be initialized
    5 |   int N[5][M] = {0};
      |   ^~~

您不能初始化可變長度數組。 但是你可以在 C98 中定義它的大小。

一種可能的解決方案是在#define預處理器中定義M

#define M 5

您將不會再收到數組初始值設定項中元素過多的警告,示例代碼:

#include <stdio.h>
#define M 5  // Here we go

int main(void) {
  int N[5][M] = {0};

  for (int i = 0; i < M; i++)
    for (int j = 0; j < M; j++)
      printf("%d ", N[i][j]);
    printf("\n");
  
  return 0;
}

在此代碼之后,二維數組將不再是 VLA。

它會顯示:

0 0 0 0 0 
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM