我使用memset来初始化bool数组。但是,答案并非如此。谁能告诉我原因?
int countPrimes(int n) {
bool *flag = new bool[n];
int i, res = 0;
memset(flag,false,sizeof(flag));
for (i = 0 ; i<n ; i++) {
答案 0 :(得分:2)
问题是sizeof(flag)
不知道分配给指针flag
的数组的大小。指针的大小对于体系结构是固定的,这意味着只有动态数组的初始部分才会被初始化(或者如果n
很小,则会导致未定义的行为)。
如果你坚持使用&#34; plain&#34;数组bool
,将初始化代码更改为:
memset(flags, false, sizeof(*flags)*n); // Wouldn't work with true
更好的方法是使用std::vector<bool>
,它使用一种实现,与&#34; plain&#34;相比,可以节省大量内存。数组bool
:
int countPrimes(int n) {
std::vector<bool> flag(n, false);
int res = 0;
for (int i = 0 ; i != n ; i++) {
...
}
return res;
}
请注意,std::vector<bool>
的使用使您无需在完成动态分配的数组后调用delete[] flags
。
答案 1 :(得分:2)
在C ++中,我们使用std::fill
:
bool* flags = new bool[n];
std::fill(flags, flags+n, false); // Also works with `true`.
答案 2 :(得分:0)
数组项的大小为sizeof(bool)
或等效sizeof *flag
,数组的大小为n*sizeof(bool)
或n*sizeof *flag
,不是 { {1}}。值sizeof flag
很可能是4(指针类型的大小),因此您的数组的4个项目设置为sizeof flag
(0
)。< / p>