我在C中有一个大数组(不是c++,如果这有区别的话)。我想初始化相同值的所有成员。
我发誓我曾经知道一个简单的方法。在我的情况下,我可以使用memset(),但没有一种方法来做到这一点,这是建立在C语法?
我在C中有一个大数组(不是c++,如果这有区别的话)。我想初始化相同值的所有成员。
我发誓我曾经知道一个简单的方法。在我的情况下,我可以使用memset(),但没有一种方法来做到这一点,这是建立在C语法?
当前回答
我看到了一些使用这种语法的代码:
char* array[] =
{
[0] = "Hello",
[1] = "World"
};
它变得特别有用的地方是当你创建一个使用枚举作为索引的数组时:
enum
{
ERR_OK,
ERR_FAIL,
ERR_MEMORY
};
#define _ITEM(x) [x] = #x
char* array[] =
{
_ITEM(ERR_OK),
_ITEM(ERR_FAIL),
_ITEM(ERR_MEMORY)
};
这使事情保持有序,即使您碰巧把一些枚举值写成了无序的顺序。
关于这项技术的更多信息可以在这里和这里找到。
其他回答
如果数组恰好是int或int大小的任何东西,或者你的mempattern的大小恰好符合int的精确时间(即全部为零或0xA5A5A5A5),最好的方法是使用memset()。
否则,在循环中调用memcpy()移动索引。
在过去(我并不是说这是个好主意),我们设置了第一个元素,然后:
Memcpy (&element [1], &element [0], sizeof (element)-sizeof (element [0]);
甚至不确定它是否还能工作(这将取决于memcpy的实现),但它通过重复地将初始元素复制到下一个元素来工作-甚至对结构数组也有效。
通过所有的喋喋不休,简短的回答是,如果你在编译时打开优化,你不会做得比下面更好:
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,指向空值,等等)
我在这个问题中没有看到任何要求,所以解决方案必须是通用的:初始化一个未指定的可能是多维数组,由一个初始成员值的未指定的可能是结构元素构建:
#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