int a[4];
unsigned int size = sizeof(a) / sizeof(a[0]);
for (unsigned int i = 0; i < size; i++)
a[i] = 0;
46
#include<stdio.h>
int main(){
int i,a[50];
for (i=0;i<50;i++){
a[i]=5;// set value 5 to all the array index
}
for (i=0;i<50;i++)
printf("%d\n",a[i]);
return 0;
}
19 回答
对于初始化'普通'数据类型(如int数组),您可以使用括号表示法,但如果数组中仍有空格,它将在最后一个之后将值归零:
没有人提到索引顺序来访问初始化数组的元素 . 我的示例代码将给出一个说明性示例 .
输出是:
如果要确保显式初始化数组的每个成员,只需省略声明中的维:
编译器将从初始化列表中推导出维度 . 不幸的是,对于多维数组,只能省略最外层的维度:
没关系,但是
不是 .
我认为这比
加入数组大小的变化 .
如果数组碰巧是int或任何大小为int的内容,或者你的mem-pattern的大小恰好适合int(即全零或0xA5A5A5A5),最好的方法是使用memset() .
否则在移动索引的循环中调用memcpy() .
通过所有的讨论,简短的回答是,如果你在编译时打开优化,你将不会做得更好:
额外奖励:代码实际上清晰可见:)
我在问题中看不到任何要求,因此解决方案必须是通用的:初始化未指定的可能多维数组,该数组是使用初始成员值从未指定的可能结构元素构建的:
结果:
编辑:
start+element_size
更改为(char*)start+element_size
我看到一些使用这种语法的代码:
如果您正在创建一个使用枚举作为索引的数组,那么它变得特别有用:
这样可以使事情保持正常,即使您碰巧无序地编写了一些枚举值 .
有关此技术的更多信息,请参见here和here .
你可以像上面详述的那样完成整个静态初始化器的事情,但是当你的数组大小发生变化时(当你的数组嵌入时,如果你没有添加适当的额外初始化器,你会得到垃圾),它可能真的很糟糕 .
memset为您的工作提供了运行时命中,但没有正确执行的代码大小不受阵列大小更改的影响 . 几乎在所有情况下,当阵列大于几十个元素时,我会使用此解决方案 .
如果静态声明数组非常重要,我会编写一个程序来为我编写程序并使其成为构建过程的一部分 .
除非该值为0(在这种情况下,您可以省略初始化程序的某些部分,并且相应的元素将初始化为0),否则没有简单的方法 .
但是,不要忽视明显的解决方案:
缺少值的元素将初始化为0:
所以这会将所有元素初始化为0:
在C中,空的初始化列表也会将每个元素初始化为0.这是带有C的not allowed:
请记住,如果未指定初始化程序,具有静态存储持续时间的对象将初始化为0:
而“0”并不一定意味着“所有位为零”,因此使用上述方法比memset()更好,更便携 . (浮点值将初始化为0,指向空值的指针等)
有一种快速的方法来初始化具有给定值的任何类型的数组 . 它适用于大型阵列 . 算法如下:
初始化数组的第一个元素(通常的方式)
复制已设置为尚未设置的部分,将每次下一次复制操作的大小加倍
对于
1 000 000
elementsint
array,它比常规循环初始化快4倍(i5,2核,2.3 GHz,4GiB内存,64位):loop runtime 0.004248 [seconds]
memfill() runtime 0.001085 [seconds]
如果您的编译器是GCC,您可以使用以下语法:
查看详细说明:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html
对于延迟初始化(即类成员构造函数初始化),请考虑:
它将给出o / p 5 5 5 5 5 5 ......直到整个阵列的大小
对于静态初始化具有相同值的大型数组,没有多个复制粘贴,您可以使用宏:
如果您需要更改该值,则必须仅在一个地方进行更换 .
编辑:可能有用的扩展
(Jonathan Leffler提供)
您可以通过以下方式轻松概括:
可以使用以下方法创建变体:
适用于结构或复合数组 .
宏名称可以协商 .
一个略微诙谐的答案;写下声明
在您最喜欢的支持数组的语言中(我的是Fortran,但还有很多其他语言),并将其链接到您的C代码 . 你可能想把它包装成一个外部函数 .
我知道用户
Tarski
以类似的方式回答了这个问题,但我补充了一些细节 . 原谅我的一些C,因为我更倾向于想要使用C,但现在就这样了 .如果你提前知道阵列的大小......
上面有一些警告;一个是
UINT myArray[size];
在声明时没有直接初始化,但是下一个代码块或函数调用会将数组的每个元素初始化为您想要的相同值 . 另一个警告是,你必须为你支持的每个type
写一个initializing function
,你还必须修改printArray()
函数来支持这些类型 .您可以使用在线编译器here尝试此代码 .
如果您的数组声明为静态或是全局的,则数组中的所有元素都具有默认的默认值0 .
有些编译器在调试模式下将数组的默认值设置为0 .
确实如此容易设置默认为0:int array [10] = {0};
但是,对于其他值,您使用了memset()或loop;
示例:int array [10]; memset(array,-1,10 * sizeof(int));
这是另一种方式:
看到:
C-Extensions
指定的内容
然后问一个问题:何时可以使用C扩展?
上面的代码示例位于嵌入式系统中,永远不会看到来自其他编译器的光 .