C 如何使用memset初始化值不是0的buffer?
将用o初始化增益 但是下面将不会用5初始化buff。那么,在C(而不是C++)中使用memset实现这一点的方法是什么呢?我想为此使用memsetC 如何使用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
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的答案中的lamemset_pattern4
)时,编译器甚至可以选择优化该循环以调用该函数。@stephennon这很有趣。我以前从未听说过。当一个简单的循环可以转换为例如memcpy
或memset
时,编译器肯定会执行优化。匹配特定于平台的函数不太常见,但某些编译器确实实现了它。即使编译器没有这样做,这个循环也是自动矢量化的一个很好的候选者。
for (i = 0; i < 1000; i++) buff[i] = 5;