【问题标题】:memset function in c languagec语言中的memset函数
【发布时间】:2011-10-12 14:03:26
【问题描述】:

我现在正在研究memset函数,但是所有的例子都是关于char数组的,如下:

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

它会将这个 char 数组中的每个元素设置为 0。

我想知道memset是否可以应用于int数组或float数组?

【问题讨论】:

  • 甚至,memset 可以应用于struct。任何记忆都可以,只要你有权写。
  • 为什么不只是char a[100] = {};
  • @Muggen:因为那不是有效的 C...(您需要在大括号内添加一个零才能使其有效。)
  • @Fecal - 它将指针设置为 0,这可能与 NULL 相同,但不能保证。
  • memset(a, 0, sizeof a) 会将a 的内容设置为全字节零。但除非a 是某个整数类型的数组(注意:char 是整数类型),否则不能保证将值设置为零。 可能全字节零表示浮点类型的 0.0 或指针类型的空指针,但语言不保证这一点。要将对象初始化为全零,无论其类型如何,您都可以编写some_type a = { 0 };。 (一些编译器可能会警告缺少初始化程序,但未指定的元素设置为零。)

标签: c arrays memset


【解决方案1】:

是的,它可以应用于任何内存缓冲区,但你必须输入正确的内存缓冲区大小...memset将任何内存缓冲区视为一系列字节,所以无论是charint,@ 987654325@、double 等等,都无所谓。请记住,它不会将多字节类型设置为特定的非零值......例如:

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

a的每个成员设置为值1 ...而是将a占用的内存缓冲区中的每个字节设置为1,表示每四个字节的int将被设置为0x01010101的值,与0x00000001不同

【讨论】:

【解决方案2】:

对于静态大小和可变长度的数组,您可以

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


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

(如果您将数组作为函数参数传递,这将不起作用:Behaviour of Sizeof in C

【讨论】:

    【解决方案3】:

    它可以应用于任何数组。最后的 100 是以字节为单位的大小,所以一个整数每个是 4 个字节,所以它是 -

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

    明白了吗? :)

    【讨论】:

    • PS:它不仅仅是数组,它的任意内存块,在我的示例中,您将内存从位置设置为值 0,长度为 400 字节 - 它不关心内存的格式作为。
    • 你真的需要提到sizeof
    猜你喜欢
    • 1970-01-01
    • 2016-08-19
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多