[英]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.