Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;数组初始化不工作_C++_Arrays_Gcc - Fatal编程技术网

C++ C++;数组初始化不工作

C++ C++;数组初始化不工作,c++,arrays,gcc,C++,Arrays,Gcc,我正在尝试初始化布尔数组,如下所示: bool FcpNumberIsOk[MAX_FCPS]={true}; 但是当我调试它时,我只看到数组的第一个元素被初始化,其他元素都是false。怎么会这样?我在Ubuntu10上使用Qt,初始化是在方法内部的本地数组上完成的 >谢谢你的回答。因为你已经明确地初始化了数组的第一个元素,只有第一个元素被初始化,其余的不是.< /p> ,因为这是数组初始化在C++中工作的方式。如果没有显式地为每个元素指定一个值,则该元素默认为零(或者,这里为false)

我正在尝试初始化布尔数组,如下所示:

bool FcpNumberIsOk[MAX_FCPS]={true};
但是当我调试它时,我只看到数组的第一个元素被初始化,其他元素都是false。怎么会这样?我在Ubuntu10上使用Qt,初始化是在方法内部的本地数组上完成的


<> >谢谢你的回答。

因为你已经明确地初始化了数组的第一个元素,只有第一个元素被初始化,其余的不是.< /p> ,因为这是数组初始化在C++中工作的方式。如果没有显式地为每个元素指定一个值,则该元素默认为零(或者,这里为false)

注意

 bool FcpNumberIsOk[MAX_FCPS];

将所有值设置为false或随机设置,具体取决于定义位置。

这是预期行为。第一个元素初始化为指定值,其余元素初始化为默认值0:

int c[5] = {1};

// 1 0 0 0 0
for(int i = 0; i < 5; ++i)
  std::cout << c[i] << ' ';
intc[5]={1};
// 1 0 0 0 0
对于(int i=0;i<5;++i)

std::cout使用此语法,您只初始化第一个元素(使用您的值和其他get default one[false]),而不初始化其他元素。
您应该使用int-array和memset或for-loop来初始化所有元素。

您误解了。您似乎认为,任何未提及的元素都将被初始化为与上次显式初始化的值相同的值。您提到的最后一个值是
true
,因此所有其他元素也将初始化为
true
。我曾经有过同样的信念,但我很快就明白了

这不是它的工作原理。任何未提及的元素都会得到默认初始化,这对于
bool
意味着
false

要将所有元素设置为
true
,请尝试类似
std::fill\n

std::fill_n(FcpNumberIsOk, MAX_FCPS, true);

其余部分初始化为默认值0。这就是为什么使用
inti[10]={0}是安全的到0-初始化数组。实际上所有元素都会初始化。标准规定所有剩余的元素都被设置为0。@meagar你怎么能说“int i[10]={0}”除了在第一个元素上设置0之外还有其他作用。@yan我很肯定他会这么说,因为这就是语言的工作方式。但是@yan,默认情况下它还没有被使用。如果您根本没有给出任何初始值设定项,那么数组(通常)是未初始化的。数组可能包含
true
false
的组合,以及根本无效的
bool
值。如果初始化任何元素,那么C++提供了对其余元素提供默认值的快捷方式。这不是零效应。我认为让语言像你(和我曾经)认为的那样工作是有好处的,但是现在改变它已经太晚了。那里的代码已经依赖于当前的行为。实际上所有的元素都被初始化了。标准规定所有剩余的元素都设置为0。我的意思是。好吧,我错了。
memset
在大多数情况下都可以工作,但不可移植<代码>::std::fill
更好,可以在
bool
数组上工作,在一个好的编译器上它也同样有效。我在msvc上使用std::copy with vectors的经验不太好。因此,为了提高效率,我使用了memcpy和memset函数。速度是100%快。但是,是的,我对它们总是非常小心。第二个版本是什么时候初始化的?我认为只有当您显式默认初始化包含类/struct?@jdv时,如果您将变量定义为具有静态存储持续时间(本地/类静态,命名空间范围变量),则在程序启动时,它在发生任何其他事情之前初始化为零。看见
std::fill_n(FcpNumberIsOk, MAX_FCPS, true);