C
是否有更简单的方法将数组设置为一个值而不是使用for
循环并逐个设置每个值?
答案 0 :(得分:20)
如果您将数组设置为全0,或者数组是字节数组,则可以使用memset
// Set myArray to all 0's
memset(myArray, 0, numberOfElementsInMyArray * sizeof(myArray[0]));
如果你需要以大于一个字节的单位将其设置为0以外的其他值(例如,将int
s的数组设置为1),那么没有标准函数可以做到这一点 - 你将会必须为此编写自己的循环。
答案 1 :(得分:8)
您可以将其设置为相同的值,但仅限0
How to initialize all members of an array to the same value?
将所有元素初始化为0
:
int myArray[10] = { 0 }; // all elements 0
gcc的页面也有答案。
答案 2 :(得分:5)
如果是字节值数组,或者您想将每个字节设置为特定值,则可以使用memset
:
char xyzzy[100];
int plugh[40];
memset (xyzzy, 7, sizeof (xyzzy)); // all chars set to 7.
memset (plugh, 0x42, sizeof (plugh)); // all integers set to (e.g.) 0x42424242.
另一种可能性是在初始化时创建正确大小的模板(根据下面的实际初始化,或在init
函数中),然后调用memcpy
到 blat (a) 以后将它放到真实阵列上。
static int template[] = { 1, 1, 1, 1, 1 };
int zorkmid[3];
memcpy (zorkmid, template, sizeof (zorkmid)); // ensure template is at
// least as big as zorkmid.
后一种方法对于使用固定的预先计算的值填充结构也很方便:初始化一个虚拟副本,其中包含所需的字段memcpy
,而不是每次需要新实例时手动设置所有字段
(a) 旁白: blat
的词源:
Jargon file(请参阅所有定义的词汇表)列出blat
作为四个metasyntactic变量{foo, bar, thud, blat}
,或blast
的同义词,感知1。 / p>
答案 3 :(得分:3)
取决于价值。如果为零,请使用memset(a, 0, sizeof(a))
。否则,如果它是一个char数组,你可以使用memset和其他值。但是memset总是在char级别工作,所以如果你的数组不是char,那么零可能是有意义的。
答案 4 :(得分:0)
这是一个古老的问题,但这是我的两分钱。
我猜想计算机必须以一种或另一种方式遍历每个值。那么,为什么不在宏内使用for循环呢?这样,您的代码就不会混乱,您可以获得类似函数的信息。
对于堆栈分配的数组(具有编译时定义的大小):
#define fill_array(array, value) \
for(int i; i < sizeof(array)/sizeof(array[0]); i++) \
{array[i]=value;}
对于堆分配的数组(iter是指向数组第一个条目的指针):
#define fill_array(iter, lengt, value) \
for(int i; i < length; i++) \
{*iter=value; iter++;}