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

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


当前回答

你可以像上面详细描述的那样做整个静态初始化器的事情,但是当你的数组大小发生变化时(当你的数组变大时,如果你没有添加适当的额外初始化器,你就会得到垃圾),这可能是一个真正的麻烦。

Memset为您的工作提供了一个运行时命中,但是任何正确的代码大小命中都不受数组大小变化的影响。当数组大于几十个元素时,我几乎在所有情况下都会使用这个解决方案。

如果静态声明数组真的很重要,我会写一个程序来为我编写程序,并使其成为构建过程的一部分。

其他回答

通过所有的喋喋不休,简短的回答是,如果你在编译时打开优化,你不会做得比下面更好:

int i,value=5,array[1000]; 
for(i=0;i<1000;i++) array[i]=value; 

额外的好处:代码实际上是易读的:)

除非该值为0(在这种情况下,可以省略初始化式的某些部分 并且相应的元素将被初始化为0),没有简单的方法。

不过,不要忽视显而易见的解决方案:

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

缺少值的元素将初始化为0:

int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...

所以这将把所有元素初始化为0:

int myArray[10] = { 0 }; // all elements 0

在c++中,空初始化列表也会将每个元素初始化为0。 C在C23之前是不允许的:

int myArray[10] = {}; // all elements 0 in C++ and C23

记住,如果没有,具有静态存储持续时间的对象将初始化为0 初始化式被指定:

static int myArray[10]; // all elements 0

而“0”并不一定意味着“全位零”,所以使用上面的是 比memset()更好、更可移植。(浮点值将是 初始化为+0,指向空值,等等)

在过去(我并不是说这是个好主意),我们设置了第一个元素,然后:

Memcpy (&element [1], &element [0], sizeof (element)-sizeof (element [0]);

甚至不确定它是否还能工作(这将取决于memcpy的实现),但它通过重复地将初始元素复制到下一个元素来工作-甚至对结构数组也有效。

略带开玩笑的回答;写语句

array = initial_value

用你最喜欢的支持数组的语言(我的是Fortran,但还有很多其他语言),并将它链接到你的C代码。你可能想把它包装成一个外部函数。

如果预先知道数组的大小,可以使用Boost预处理器C_ARRAY_INITIALIZE宏来为你做这项脏工作:

#include <boost/preprocessor/repetition/enum.hpp>
#define C_ARRAY_ELEMENT(z, index, name) name[index]
#define C_ARRAY_EXPAND(name,size) BOOST_PP_ENUM(size,C_ARRAY_ELEMENT,name)
#define C_ARRAY_VALUE(z, index, value) value
#define C_ARRAY_INITIALIZE(value,size) BOOST_PP_ENUM(size,C_ARRAY_VALUE,value)