如何初始化一个数组的所有成员为相同的值?

我有一个C中的大数组(不是C ++,如果这有所作为)。 我想将所有成员初始化为相同的值。 我可以发誓我曾经知道一个简单的方法来做到这一点。 我可以在我的情况下使用memset() ,但没有办法做到这一点,内置到C语法?


除非该值为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:

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

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

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

而且这个“0”并不一定意味着“全零位”,所以使用上述方法比memset()更好,更便于携带。 (浮点值将被初始化为+0,指向空值的指针等)


如果你的编译器是GCC,你可以使用下面的语法:

int array[1024] = {[0 ... 1023] = 5};

查看详细说明:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html


要使用相同的值静态初始化大型数组,不使用多个复制粘贴,可以使用宏:

#define VAL_1X     42
#define VAL_2X     VAL_1X,  VAL_1X
#define VAL_4X     VAL_2X,  VAL_2X
#define VAL_8X     VAL_4X,  VAL_4X
#define VAL_16X    VAL_8X,  VAL_8X
#define VAL_32X    VAL_16X, VAL_16X
#define VAL_64X    VAL_32X, VAL_32X

int myArray[53] = { VAL_32X, VAL_16X, VAL_4X, VAL_1X };

如果您需要更改该值,则必须只在一个地方进行更换。

编辑:可能有用的扩展

(Jonathan Leffler提供)

你可以很容易地将其概括为:

#define VAL_1(X) X
#define VAL_2(X) VAL_1(X), VAL_1(X)
/* etc. */

可以使用以下方法创建变体:

#define STRUCTVAL_1(...) { __VA_ARGS__ }
#define STRUCTVAL_2(...) STRUCTVAL_1(__VA_ARGS__), STRUCTVAL_1(__VA_ARGS__)
/*etc */ 

与结构或复合阵列一起工作。

#define STRUCTVAL_48(...) STRUCTVAL_32(__VA_ARGS__), STRUCTVAL_16(__VA_ARGS__)

struct Pair { char key[16]; char val[32]; };
struct Pair p_data[] = { STRUCTVAL_48("Key", "Value") };
int a_data[][4] = { STRUCTVAL_48(12, 19, 23, 37) };

宏名称是可协商的。

链接地址: http://www.djcxy.com/p/27727.html

上一篇: How to initialize all members of an array to the same value?

下一篇: What is the point of overloaded Convenience Factory Methods for Collections in Java 9