我正在玩C ++中的数组。我定义了一个名为matrix的二维数组,我将提取负值并将其分配给名为array的数组。
有没有办法快速将数组初始化为零而不是枚举所有元素?我查看了其他帖子和行,例如:int array[10] = {}
或
int array[10] = {0}
不适用于我的编译器。如果我尝试使用这些语句,我会收到错误消息error: variable-sized object ‘array’ may not be initialized
。
我的教科书说所有数组在声明时都被初始化为零,但我在我的编译器上测试过这个并不是真的;我不得不通过使用for循环强制它为零。有没有正确的方法呢?
哦顺便说一句,我有一个mac并使用g ++进行编译。当我man g++
时,它表示它是llvm-gcc编译器的符号链接。
#include<iostream>
const int NROWS = 4, NCOLS = 5;
int matrix[][NCOLS] = { 16, 22, 99, 4, 18,
-258, 4, 101, 5, 98,
105, 6, 15, 2, 45,
33, 88, 72, 16, 3};
int main()
{
int SIZE = 10;
int array[SIZE];
int count=0;
// Values of array before initalized
for(int i = 0; i < SIZE; i++)
{
std::cout << array[i] << " ";
}
std::cout << std::endl;
//Initialize array to zero
for(int i = 0; i < SIZE; i++)
{
array[i]=0;
std::cout << array[i] << " ";
}
std::cout << std::endl;
// Extract negative numbers and assign to array
for(int i = 0; i < NROWS; i++)
{
for(int j = 0; j < NCOLS; j++)
{
printf("matrix[%i,%i]=%5i\n",i,j,matrix[i][j]);
if(matrix[i][j] < 0)
{
array[count] = matrix[i][j];
printf("\tarray[%d]= %4d",count, matrix[i][j]);
printf("\tcount=%d\n", count);
count++;
}
}
}
// Values of array
for(int i = 0; i < SIZE; i++)
{
std::cout << array[i] << " ";
}
std::cout << std::endl;
return 0;
}
答案 0 :(得分:5)
我在这里猜测。
int array[10] = {0};
是完全合法的,应该适用于任何编译器,但我认为你试过
int SIZE = 10;
int array[SIZE] = {0};
这完全不同,而且不合法。数组边界必须是常量,而不是变量。
有些编译器接受变量边界,但这并不合法。
答案 1 :(得分:3)
将int SIZE = 10;
更改为const int SIZE=10;
或enum{SIZE=10};
,您的基于{}
的初始化应该有效。
您不小心使用了gcc扩展名,允许使用可变大小的数组。
答案 2 :(得分:1)
您需要做的就是在您拥有的顶部:
int array [SIZE];
将其替换为:
int array[SIZE] = {};
如果您尝试这样做:
array[SIZE] = {};
稍后,它将无法正常工作。 在这种情况下,它会失败(当只有[0] - [9]时访问[10])。
您也可以使用静态数组。
请参阅:
How to initialize all members of an array to the same value?
或者如果你想使用STL数组类型,你可以查看:
http://www.cplusplus.com/reference/array/array/?kw=array
你甚至可能只需要制作SIZE var const。
答案 3 :(得分:1)
答案 4 :(得分:0)
如果数组大小与变量有关,则必须:loop through或
int array [x];
memset(array,0,x);
如果数组大小是硬编码的,您可以:
int array [10] = {0};