我在C中有一个大数组(不是c++,如果这有区别的话)。我想初始化相同值的所有成员。

我发誓我曾经知道一个简单的方法。在我的情况下,我可以使用memset(),但没有一种方法来做到这一点,这是建立在C语法?


当前回答

对于延迟初始化(即类成员构造函数初始化),请考虑:

int a[4];

unsigned int size = sizeof(a) / sizeof(a[0]);
for (unsigned int i = 0; i < size; i++)
  a[i] = 0;

其他回答

如果你想确保数组的每个成员都被显式初始化,只需从声明中省略维度:

int myArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

编译器将从初始化列表中推导出维度。不幸的是,对于多维数组,只有最外层的维度可能被省略:

int myPoints[][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };

还可以,但是

int myPoints[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };

不是。

用0初始化

  char arr[1000] = { 0 };

最好使用普通的“for循环”来进行除0以外的初始化。

  char arr[1000];
  for(int i=0; i<arr.size(); i++){
     arr[i] = 'A';
  }

作为Clemens Sielaff回答的后续。这个版本需要c++ 17。

template <size_t Cnt, typename T>                                               
std::array<T, Cnt> make_array_of(const T& v)                                           
{                                                                               
    return []<size_t... Idx>(std::index_sequence<Idx...>, const auto& v)        
    {                                                                           
        auto identity = [](const auto& v, size_t) { return v; };                
        return std::array{identity(v, Idx)...};                                 
    }                                                                           
    (std::make_index_sequence<Cnt>{}, v);                                       
}

你可以在这里看到它的作用。

int i;
for (i = 0; i < ARRAY_SIZE; ++i)
{
  myArray[i] = VALUE;
}

我觉得这比

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5...

以防数组的大小发生变化。

方法一:

int a[5] = {3,3,3,3,3}; 

形式化初始化技术。

方法二:

int a[100] = {0};

但值得注意的是

int a[10] = {1}; 

不将所有值初始化为1

这种方法只对0进行初始化

如果你这样做

int a[100];

一些编译器倾向于接受垃圾值,因此它总是首选这样做

int a[1000] = {0};