文档章节

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

 技术盛宴
发布于 2019/12/15 19:28
字数 994
阅读 30
收藏 0

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


#1楼

我在问题中看不到任何要求,因此解决方案必须是通用的:初始化未指定的可能多维数组,该数组是使用初始成员值从未指定的可能结构元素构建的:

#include <string.h> 

void array_init( void *start, size_t element_size, size_t elements, void *initval ){
  memcpy(        start,              initval, element_size              );
  memcpy( (char*)start+element_size, start,   element_size*(elements-1) );
}

// testing
#include <stdio.h> 

struct s {
  int a;
  char b;
} array[2][3], init;

int main(){
  init = (struct s){.a = 3, .b = 'x'};
  array_init( array, sizeof(array[0][0]), 2*3, &init );

  for( int i=0; i<2; i++ )
    for( int j=0; j<3; j++ )
      printf("array[%i][%i].a = %i .b = '%c'\n",i,j,array[i][j].a,array[i][j].b);
}

结果:

array[0][0].a = 3 .b = 'x'
array[0][1].a = 3 .b = 'x'
array[0][2].a = 3 .b = 'x'
array[1][0].a = 3 .b = 'x'
array[1][1].a = 3 .b = 'x'
array[1][2].a = 3 .b = 'x'

编辑: start+element_size更改为(char*)start+element_size


#2楼

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

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

宏名称可以协商。


#3楼

一个略微诙谐的答案; 写下声明

array = initial_value

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


#4楼

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


#5楼

对于初始化'普通'数据类型(如int数组),您可以使用括号表示法,但如果数组中仍有空格,它将在最后一个之后将值归零:

// put values 1-8, then two zeroes
int list[10] = {1,2,3,4,5,6,7,8};

本文转载自:https://stackoom.com/question/qJZ/如何将数组的所有成员初始化为相同的值

粉丝 0
博文 1128
码字总数 0
作品 0
深圳
高级程序员
私信 提问
加载中

评论(0)

Initialization & Cleanup

方法重载(overload)参数为基本类型的情况 方法重载时如果一系列名字相同的方法接受的参数的类型是不一样的基本类型,那么重载方法的选择规则是,将接收的参数一级一级向上提升,直到找到合适...

meisme
2013/06/03
125
0
《JAVA编程思想》学习笔记——第五章 初始化与清理

构造器 和类名相同,分无参构造器和有参构造器 方法重载 依据参数列表的不同进行重载,不能依据返回值的不同进行重载(因为很多方法的调用并不关心返回值) this关键字 this关键字只能在方法...

lixiaocheng18
2017/01/05
0
0
c#字符串及数组操作

字符串操作(取当前时间) string time=convert.tostring(DateTime.Today).split( new char []{' '}); textbox1.text=time[0]; 以空格作为分界点; 数组概述 C# 数组从零开始建立索引,即数组索......

长平狐
2013/06/17
104
0
【C++】第4章 复合类型 知识总结

《C++ Primer Plus》第4章知识点总结 内置的C++类型分两组:基本类型和复合类型。本文将介绍复合类型 数组 声明数组的通用格式:typeName arrayName[arraySize]; 数组的初始化 (1)只有在定...

qq_37792173
2017/09/20
0
0
例解GNU C之指定初始化项目

前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。 帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Exten...

vazor
2012/10/16
89
0

没有更多内容

加载失败,请刷新页面

加载更多

入门实战: ELK

ELK

BeanHo
34分钟前
22
0
PHP一致性hash代码

[TOC] PHP实现一致性hash bash命令 因为下面PHP代码的模拟用户用的是随机数,所以统计结果达不到绝对的均衡. php ./hash.php | sort | uniq -c | sort PHP代码 这是之前学的时候留下来的测试...

我爱吃炒鸡
今天
94
0
OSChina 周六乱弹 —— 现在看动弹的人都是什么状态

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《夏日、教室与望着窗外的我》- Candy_Wind 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
899
11
wamp环境安装redis扩展

1.查看phpinfo信息根据配置信息下载对应的扩展 关键信息:VC14,TS,x86 2.下载php_redis和php_igbinary扩展 php_redis扩展下载地址: https://windows.php.net/downloads/pecl/snaps/redis...

点滴课程
今天
36
0
开源商城开发笔记1-创建MyBatis示例

一、修改pom.xml,引入MyBatis,JUnit,Log4j <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version>......

土龙
今天
56
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部