繁体   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