int buff[1000]
memset(buff, 0, 1000 * sizeof(int));
将使用o
初始化buff但以下不会用5来初始化buff。那么在C中使用memset实现这一目的的方法是什么(不是在C ++中)?我想为此目的使用memset。
int buff[1000]
memset(buff, 5, 1000 * sizeof(int));
答案 0 :(得分:7)
memset
将字节而非数据类型初始化为值。所以对你的例子......
int buff[1000]
memset(buff, 5, 1000 * sizeof(int));
...如果int
是四个字节,则所有四个字节都将初始化为5.每个整数实际上的值为0x05050505 == 84215045
,而不是5
,正如您所期望的那样。
如果你想将数组中的每个整数初始化为5,你必须这样做:
int i;
for(i = 0; i < 1000; i++)
buff[i] = 5;
答案 1 :(得分:1)
根据您使用的操作系统,您可以使用memset_pattern4 et al,否则您只需要循环播放。
答案 2 :(得分:1)
我个人不建议memset
进行一般初始化。有太多东西你必须确保能够正确和便携地使用它。它基本上只适用于char
数组或微控制器代码。
在C中初始化数组的方法如下(假设大小为N
):
for (i = 0; i < N; ++i)
buff[i] = init_value;
使用C99,你可以做更多有趣的事情。例如,假设缓冲区是以下结构的数组:
struct something
{
size_t id;
int other_value;
};
然后你可以像这样初始化:
for (i = 0; i < N; ++i)
buff[i] = (struct something){
.id = i
};
这称为指定初始化程序。与所有其他初始化器的情况一样,如果您没有提及结构的特定字段,它将自动归零。
答案 3 :(得分:0)
如果buff不是字节数组,则只能使用memset将其初始化为包含重复十六进制值的值(例如-1,0x01010101等)
执行此操作的一种方法是使用memcpy
,因此:
buff[0] = 5;
memcpy(buff + 1, buff, sizeof(buff) - sizeof(*buff))
HOWEVER 这取决于未定义的行为,可能会也可能不适用于您的系统。
一个不错的编译器应该从
产生一个足够有效的循环for (i = 0; i < 1000; i++) buff[i] = 5;