将数组设置为一个值

有没有一种更简单的方法在C中将数组设置为一个值而不是使用for循环并逐个设置每个值?

如果要将数组设置为全0,或者数组是字节数组,则可以使用memset

 // Set myArray to all 0's memset(myArray, 0, numberOfElementsInMyArray * sizeof(myArray[0])); 

如果你需要以大于一个字节的单位将它设置为0以外的东西(例如将int的数组设置为1),那么没有标准函数可以做到这一点 – 你必须编写自己的for循环为了那个原因。

您可以将其设置为相同的值,但仅设置为0

如何将数组的所有成员初始化为相同的值?

将所有元素初始化为0

 int myArray[10] = { 0 }; // all elements 0 

gcc的页面也有一个答案。

如果它是一个字节值数组,或者您想将每个字节设置为特定值,则可以使用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 (eg) 0x42424242. 

另一种可能性是在初始化时创建一个正确大小的模板(根据下面的实际初始化,或者在init函数中),然后调用memcpy以便稍后将它放到真实数组上。

 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) blatblat词源:

Jargon文件 (参见所有定义的词汇表)将blat列为四个metasyntactic变量{foo, bar, thud, blat} ,或者是blast ,sense 1的同义词。

反过来, blast (感应1)被定义为BLT不是三明治)的同义词,其“涉及任何大的位字段复制或移动操作”。

取决于价值。 如果它为零,则使用memset(a, 0, sizeof(a)) 。 否则,如果它是一个char数组,你可以使用memset和其他值。 但是memset总是在char级别工作,所以如果你的数组不是char,那么零可能是有意义的。

这是一个古老的问题,但这是我的两分钱。

我猜计算机必须以某种方式迭代每个值。 那么为什么不在宏中使用for-loop呢? 这样你的代码就不会混乱,你会得到类似函数的东西。

对于堆栈分配的数组(具有编译时定义的大小):

 #define fill_array(array, value) \ for(int i; i < sizeof(array)/sizeof(array[0]); i++) \ {array[i]=value;} 

对于堆-alllocated数组(iter是指向数组的第一个条目的指针):

 #define fill_array(iter, lengt, value) \ for(int i; i < length; i++) \ {*iter=value; iter++;}