为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2019-05-28 17:48:48
如何将数组的所有成员初始化为相同的值?我在C中有一个大数组(如果有所不同,则不是C ++)。我想将所有成员初始化为相同的值。我发誓我曾经知道一个简单的方法来做到这一点。我可以memset()在我的情况下使用,但是没有办法在C语法中构建这样做吗?
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

除非该值为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,指向空值的指针等)


查看完整回答
反对 回复 2019-05-28
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

对于静态初始化具有相同值的大型数组,无需多次复制粘贴,您可以使用宏:


#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) };

宏名称可以协商。


查看完整回答
反对 回复 2019-05-28
  • 3 回答
  • 0 关注
  • 2028 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信