我在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)
};
这使事情保持有序,即使您碰巧把一些枚举值写成了无序的顺序。
关于这项技术的更多信息可以在这里和这里找到。
其他回答
如果你的编译器是GCC,你可以使用以下“GNU扩展”语法:
int array[1024] = {[0 ... 1023] = 5};
查看详细描述: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html
对于初始化“普通”数据类型(如int数组),你可以使用括号符号,但如果数组中仍有空格,它将把最后一个后面的值归零:
// put values 1-8, then two zeroes
int list[10] = {1,2,3,4,5,6,7,8};
对于延迟初始化(即类成员构造函数初始化),请考虑:
int a[4];
unsigned int size = sizeof(a) / sizeof(a[0]);
for (unsigned int i = 0; i < size; i++)
a[i] = 0;
如果你想确保数组的每个成员都被显式初始化,只需从声明中省略维度:
int myArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
编译器将从初始化列表中推导出维度。不幸的是,对于多维数组,只有最外层的维度可能被省略:
int myPoints[][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };
还可以,但是
int myPoints[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };
不是。
如果数组声明为静态或全局,则所有元素 在数组中已经有默认默认值0。 一些编译器在调试模式中将array的默认值设置为0。 将默认值设置为0很容易: Int数组[10]= {0}; 但是,对于其他值,您必须使用memset()或loop;
例子: int数组[10]; Memset(数组,- 1,10 *sizeof(int));