C 如何使用memset初始化值不是0的buffer?

C 如何使用memset初始化值不是0的buffer?,c,C,将用o初始化增益 但是下面将不会用5初始化buff。那么,在C(而不是C++)中使用memset实现这一点的方法是什么呢?我想为此使用memset int buff[1000] memset(buff, 0, 1000 * sizeof(int)); memset将字节而不是数据类型初始化为值。以你为例 int buff[1000] memset(buff, 5, 1000 * sizeof(int)); …如果int是四个字节,则所有四个字节都将初始化为5。每个整数的实际值为0x050

将用o初始化增益

但是下面将不会用5初始化buff。那么,在C(而不是C++)中使用memset实现这一点的方法是什么呢?我想为此使用memset

int buff[1000] 
memset(buff, 0, 1000 * sizeof(int));

memset
将字节而不是数据类型初始化为值。以你为例

int buff[1000] 
memset(buff, 5, 1000 * sizeof(int));
…如果
int
是四个字节,则所有四个字节都将初始化为5。每个整数的实际值为
0x0505055==84215045
,而不是您所期望的
5

如果要将数组中的每个整数初始化为5,则必须执行以下操作:

int buff[1000] 
memset(buff, 5, 1000 * sizeof(int));
struct something
{
    size_t id;
    int other_value;
};
inti;
对于(i=0;i<1000;i++)
buff[i]=5;

根据您所使用的操作系统,您可能可以使用,否则您只需使用循环即可。

我个人不建议将
memset
用于常规初始化。有太多的事情你必须确保能够正确和便携地使用它。它基本上只适用于
char
阵列或微控制器代码

在C中初始化数组的方法如下(假设大小
N
):

然后您可以这样初始化:

int buff[1000] 
memset(buff, 5, 1000 * sizeof(int));
struct something
{
    size_t id;
    int other_value;
};
(i=0;i buff[i]=(构造某物){ .id=i };
这称为指定初始值设定项。与初始化器的所有其他情况一样,如果不提及结构的特定字段,它将自动进行零初始化。

如果buff不是字节数组,则只能使用memset将其初始化为包含重复十六进制值的值(例如-1、0x01010101等)

一种方法是使用
memcpy
,因此:

for (i = 0; i < N; ++i)
    buff[i] = (struct something){
        .id = i
    };
但是这取决于未定义的行为,可能在您的系统上工作,也可能不工作

一个好的编译器应该从中生成足够有效的循环

buff[0] = 5;
memcpy(buff + 1, buff, sizeof(buff) - sizeof(*buff))
(i=0;i<1000;i++)buff[i]=5;
buff的类型是什么?buff数据类型是什么?它是整数吗?
memset
将每个字节设置为指定值。如果你在一个多字节数据类型上运行,你不能使用<代码> MyStuts<代码>来设置它们的任意值。这不是链接问题的一个DUP,因为这个问题是C++的(正确的事情是使用<代码> STD::FILIN N< /COD>)。这个问题是针对C的,答案是不同的。我不知道任何现代系统中所建议的
memcpy
技巧都能“起作用”。我不认为故意建议未定义是可以的behavior@Shahbaz这取决于他的系统如何工作以及他对优化的绝望程度。我也不会建议memset填充数组,因为它不是clear@TomTanner,设置元素的简单for循环可以像
memcpy
一样进行优化。请注意,
memcpy
需要
restrict
指向源和目标的指针。这意味着(粗略地说)优化器可以假设它们没有重叠,并相应地进行优化。如果你给它重叠的内存区域,即使你的答案是“更优化”,那也完全是不正确的。我意识到一个好的编译器可以生成在memset优化过的代码。但是相信我,我在不同的地方都遇到过很多类似memcpy的代码。如果OP不走运,他们会去的。假设我应该反过来说。当针对具有优化填充实现的平台(Paul R的答案中的la
memset_pattern4
)时,编译器甚至可以选择优化该循环以调用该函数。@stephennon这很有趣。我以前从未听说过。当一个简单的循环可以转换为例如
memcpy
memset
时,编译器肯定会执行优化。匹配特定于平台的函数不太常见,但某些编译器确实实现了它。即使编译器没有这样做,这个循环也是自动矢量化的一个很好的候选者。
for (i = 0; i < 1000; i++) buff[i] = 5;