我在C中有一个大数组(不是c++,如果这有区别的话)。我想初始化相同值的所有成员。
我发誓我曾经知道一个简单的方法。在我的情况下,我可以使用memset(),但没有一种方法来做到这一点,这是建立在C语法?
我在C中有一个大数组(不是c++,如果这有区别的话)。我想初始化相同值的所有成员。
我发誓我曾经知道一个简单的方法。在我的情况下,我可以使用memset(),但没有一种方法来做到这一点,这是建立在C语法?
当前回答
方法一:
int a[5] = {3,3,3,3,3};
形式化初始化技术。
方法二:
int a[100] = {0};
但值得注意的是
int a[10] = {1};
不将所有值初始化为1
这种方法只对0进行初始化
如果你这样做
int a[100];
一些编译器倾向于接受垃圾值,因此它总是首选这样做
int a[1000] = {0};
其他回答
对于初始化“普通”数据类型(如int数组),你可以使用括号符号,但如果数组中仍有空格,它将把最后一个后面的值归零:
// put values 1-8, then two zeroes
int list[10] = {1,2,3,4,5,6,7,8};
我看到了一些使用这种语法的代码:
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 a[4];
unsigned int size = sizeof(a) / sizeof(a[0]);
for (unsigned int i = 0; i < size; i++)
a[i] = 0;
如果数组声明为静态或全局,则所有元素 在数组中已经有默认默认值0。 一些编译器在调试模式中将array的默认值设置为0。 将默认值设置为0很容易: Int数组[10]= {0}; 但是,对于其他值,您必须使用memset()或loop;
例子: int数组[10]; Memset(数组,- 1,10 *sizeof(int));
我在这个问题中没有看到任何要求,所以解决方案必须是通用的:初始化一个未指定的可能是多维数组,由一个初始成员值的未指定的可能是结构元素构建:
#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