stackoverflow热门问题(三)-如何用一个值来初始化所有数组成员?
stackoverflow热门问题目录前几篇机翻味道有点重,所以后续的大概会用我平时的行文习惯来写,但可能会出现更多的翻译错误,希望各位能够指正,谢谢。感觉开这个栏目好有用。
如何用一个值来初始化所有数组成员?
- Matt 提问:
- 我想将C语言中一个特别大的数组中的每个元素都初始化成一个值,
- 我知道可以用
memset()
来完成它,但能不能直接用语法完成这个功能?
- 24个回答:
- aib - 1333 位用户认为有用:
- 除非想把他们都设成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并不只代表数值0,所以使用上面所述的方法比memset()更合适(浮点数会被初始化成+0,指针则被初始化成NULL等)。
- qrdl - 421 位用户认为有用
- 如果编译器是GCC的话,可以试试这个语法:
int array[1024] = {[0 ... 1023] = 5};
- 这里有详细的描述:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html
- 如果编译器是GCC的话,可以试试这个语法:
- mouviciel - 185 位用户认为有用:
- 用下面的宏,可以在不多次复制粘贴的情况初始化一个特别大的数组:
#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) };
- 当然,宏名称可以自定义。
- 用下面的宏,可以在不多次复制粘贴的情况初始化一个特别大的数组:
- aib - 1333 位用户认为有用:
How to initialize all members of an array to the same value?
- Matt asked:
- I have a large array in C (not C++ if that makes a difference). I want to initialize all members of the same value.
- 我想将C语言中一个特别大的数组中的每个元素都初始化成一个值,
- I could swear I once knew a simple way to do this. I could use
memset()
in my case, but isn't there a way to do this that is built right into the C syntax?- 我知道可以用
memset()
来完成它,但能不能直接用语法完成这个功能?
- 我知道可以用
- I have a large array in C (not C++ if that makes a difference). I want to initialize all members of the same value.
- 24 Answers:
- aib - 1333 位用户认为有用:
- Unless that value is 0 (in which case you can omit some part of the initializer and the corresponding elements will be initialized to 0), there's no easy way.
- 除非想把他们都设成0,不然没有更简单的方法(某些编译器会将元素初始化成0)。
- Don't overlook the obvious solution, though:
- 但不要忽略这个最基本的方法:
int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
- Elements with missing values will be initialized to 0:
- 缺失的元素将被初始化成0:
int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...
- So this will initialize all elements to 0:
- 同理,这将全部被初始化成0:
int myArray[10] = { 0 }; // all elements 0
- In C++, an empty initialization list will also initialize every element to 0. This is not allowed with C:
- 在C++中,一个空的初始化列表会将每个元素都初始化成0,但C不会。
int myArray[10] = {}; // all elements 0 in C++
- Remember that objects with static storage duration will initialize to 0 if no initializer is specified:
- 如果没指定构造方法,静态对象在存储期间将被初始化成0。
static int myArray[10]; // all elements 0
- And that "0" doesn't necessarily mean "all-bits-zero", so using the above is better and more portable than memset(). (Floating point values will be initialized to +0, pointers to null value, etc.)
- 有时0并不只代表数值0,所以使用上面所述的方法比memset()更合适(浮点数会被初始化成+0,指针则被初始化成NULL等)。
- Unless that value is 0 (in which case you can omit some part of the initializer and the corresponding elements will be initialized to 0), there's no easy way.
- qrdl - 421 位用户认为有用
- If your compiler is GCC you can use following syntax:
- 如果编译器是GCC的话,可以试试这个语法:
int array[1024] = {[0 ... 1023] = 5};
- Check out detailed description: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html
- If your compiler is GCC you can use following syntax:
- mouviciel - 185 位用户认为有用:
- For statically initializing a large array with the same value, without multiple copy-paste, you can use macros:
- 用下面的宏,可以在不多次复制粘贴的情况初始化一个特别大的数组:
#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 };
- If you need to change the value, you have to do the replacement at only one place.
- 如果想改变初始化的值,只需要在一个地方改变就好了。
- Edit: possible useful extensions (courtesy of Jonathan Leffler)
- 注:可能有用的扩展(由Jonathan Leffler提供)
- You can easily generalize this with:
- 像下面这样用:
#define VAL_1(X) X
#define VAL_2(X) VAL_1(X), VAL_1(X)
/* etc. */
- A variant can be created using:
- 用下面这个方式定义变量:
#define STRUCTVAL_1(...) { __VA_ARGS__ }
#define STRUCTVAL_2(...) STRUCTVAL_1(__VA_ARGS__), STRUCTVAL_1(__VA_ARGS__)
/*etc */
- that works with structures or compound arrays.
- 它也能在结构体或者多维数组中使用。
#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) };
- macro names are negotiable.
- 当然,宏名称可以自定义。
- For statically initializing a large array with the same value, without multiple copy-paste, you can use macros:
- aib - 1333 位用户认为有用:
共有 0 条评论