将数组设置为一个值

时间:2010-11-01 03:44:34

标签: c

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

5 个答案:

答案 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>

反过来,blast(感知1)被定义为BLT的同义词(三明治),“指的是任何大的位字段副本或移动操作“。

答案 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++;}