如何使用memset初始化值不是0的缓冲区?

时间:2014-01-06 13:47:57

标签: c

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));

4 个答案:

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