C 初始化可变长度数组
初始化可变长度数组时,编译器会发出错误消息:C 初始化可变长度数组,c,variable-length-array,array-initialization,C,Variable Length Array,Array Initialization,初始化可变长度数组时,编译器会发出错误消息: [Error] variable-sized object may not be initialized 代码段: int n; printf("Enter size of magic square: "); scanf("%d",&n); int board[n][n] = {0}; 可变长度数组应如何初始化? 以及为什么它的所有元素没有按照下面给出的方式初始化为0 int board[n][n]; board[n]
[Error] variable-sized object may not be initialized
代码段:
int n;
printf("Enter size of magic square: ");
scanf("%d",&n);
int board[n][n] = {0};
可变长度数组应如何初始化?
以及为什么它的所有元素没有按照下面给出的方式初始化为0
int board[n][n];
board[n][n] = {0};
?您必须使用
memset
:
memset(board, 0, sizeof board);
VLA不能通过任何形式的初始化语法进行初始化。在声明之后,必须以您喜欢的方式将初始值分配给数组元素
C11:6.7.9初始化(p2和p3):
初始化者不得试图为未包含在被初始化实体中的对象提供值
要初始化的实体类型应为大小未知的数组或完整的对象类型,而不是可变长度数组类型
1.您只需按如下方式初始化数组-
int n;
printf("Enter size of magic square: ");
scanf("%d",&n);
int board[n][n];
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
board[i][j] = 0;
}
}
intn;
printf(“输入幻方的大小:”);
scanf(“%d”和“&n”);
国际板[n][n];
对于(inti=0;我不知道memset()
。这是什么意思?@haccks您只需将它放在您的行intboard[n][n];
。并确保您#包含#包含C。您想将其初始化为0
,对吗?您的意思是说intboard[n][n];
。对吗?@haccks:不。数组是不可赋值的。这就是为什么我说“将初始值赋给数组元素”。除非像memset
或memcpy
这样的原始内存操作,它必须以元素对元素的方式进行。所以,我的意思是说for(I=0;I
等等。我读到数组可以初始化为数组[m][n]={0}
,这将把它的第一个元素初始化为0
,其余的元素初始化为0
本身。@haccks:“initialized”表示={0}
可以在声明中指定为初始值设定项。您在第一条注释中的内容完全不正确。即使在声明中,它也仅适用于非VLA数组。例如,您可以执行int array[10][10]={0}
。然而,这个问题是专门针对VLA数组的。VLA数组不接受初始值设定项。当m
和n
不是常量时,你不能执行int-array[m][n]={0}
。“…memset()应该只在你想将数组设置为“0”时才使用。为什么?@alk:thememset()
函数用常量字节c填充s指向的内存区域的前n个字节。然而,整数的大小通常为4个字节,因此我们无法将整数设置为所需的数字,但“0”是一个特例,因为对于“0”,memset()
将所有字节设置为“0”。@paragangil;memset()仅当要将数组设置为“0”时才应使用:。