C语言中的memset函数

18

我现在正在学习memset函数,但是所有的示例都涉及到char数组,如下所示:

char a[100];
memset(a, 0, 100);

它将把这个字符数组中的每个元素都设置为0。

我想知道memset是否适用于int数组或float数组?


1
甚至可以将memset应用于struct。只要您有写入权限,任何内存都可以。 - Stan
1
为什么不直接使用 char a[100] = {}; 呢? - user418748
1
@Muggen:因为那不是有效的C语言...(你需要在大括号里面加一个零才能使其有效。) - R.. GitHub STOP HELPING ICE
2
@Fecal - 它会将指针设置为0,这很可能与NULL相同,但不能保证。 - Bo Persson
2
memset(a, 0, sizeof a) 将把 a 的内容设置为全零字节。但是,除非 a 是某种整数类型的数组(注意:char 是一种整数类型),否则不能保证将值设置为零。所有字节都为零很可能是浮点类型的 0.0 或指针类型的空指针的表示,但语言并不保证。要将对象初始化为全零,无论其类型如何,可以编写 some_type a = { 0 };。(某些编译器可能会警告缺少初始化程序,但未指定的元素 被设置为零。) - Keith Thompson
显示剩余3条评论
3个回答

46

是的,它可以应用于任何内存缓冲区,但您必须输入正确的内存缓冲区大小... memset 将任何内存缓冲区视为一系列字节,因此无论是 char, int, float, double 等类型都没有关系。不过,请记住它不会将多字节类型设置为特定的非零值 ... 例如:

int a[100];
memset(a, 1, sizeof(a));

这段代码不会a的每个成员设置为1...而是会将a占用的内存缓冲区中的每个字节都设置为1。这意味着每个四字节的int将被设置为0x01010101,而不是0x00000001


4
关于“多字节类型”的注释非常有帮助! - pfabri
那么,你要怎样将a的每个成员设置为1? - hola
1
如果您正在使用GCC,这里有一些不错的选项:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html。 - Jason

2

对于静态大小和可变长度的数组,你只需要

<arbitrary-type>  foo [...];
memset (foo, 0, sizeof (foo)); // sizeof() gives size of entity in bytes


经验之谈: 永远不要硬编码[数据大小]。

(如果您将数组作为函数参数传递,则此方法无效:C语言中sizeof的行为


1

它可以应用于任何数组。末尾的100是字节大小,因此一个整数每个占4个字节,所以就是 -

int a[100];
memset(a, 0, sizeof(a)); //sizeof(a) equals 400 bytes in this instance

明白了吗? :)

PS:这不仅仅涉及数组,它是关于任意内存块的。在我的例子中,您正在将从某个位置开始长度为400字节的内存设置为值0,它并不关心内存的格式是什么。 - John Humphreys
你真的需要提到sizeof。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接