memset函数

1.memset函数声明

memset函数的声明包含在<string.h>
其原型是:
void * memset ( void * ptr, int value, size_t num );
其作用是:
将从ptr所指的内存单元开始num个字节的值全部置为value,并返回ptr指针。
例如下面这段代码:

/* memset example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "almost every programmer should know memset!";
  memset (str,'-',6);
  puts (str);
  return 0;
}

str[]的初始值为“almost every programmer should know memset!”,执行memset(str,’-‘,6)语句后,str[]的值为“—— every programmer should know memset!”。
实际验证一下:


gdb调试结果和实际运行结果都显示了正确的结果。

2.使用memset函数的误区

有人可能会想到,既然memset函数可以对多个字节设置相同的值,那么是否可以对数组进行初始化呢?结论是对于char数组是可以的,但是对于in或者其他类型数组是不行的。原因是memset函数是以字节为单位进行操作的,char数组的每个元素刚好都占用一个字节,而int数组或者其他类型数组则不然。
下面我们分别对char数组和int数组实验验证一下。

#include<stdio.h>
#include<string.h>
int main()
{
    char a[10];
    memset(a,'s',sizeof(a));
    int i=0;
    for(i=0;i<10;i++)
        putchar(a[i]);
    return 0;   
}


从程序执行结果可以看到,memset函数确实将a数组的每一位均修改为‘s’了。

再看下一个例子,这次我们对int数组应用memset函数。

#include<stdio.h>
#include<string.h>
int main()
{
    int a[10];
    memset(a,0,sizeof(a));//value=0
    int i;
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    putchar('\n');
    return 0;
}

运行结果:

看起来,好像memset函数也能对int数组进行初始化,a数组的值被全部设置为0了。我们再来改一下代码;

#include<stdio.h>
#include<string.h>
int main()
{
    int a[10];
    memset(a,1,sizeof(a));//value=1
    int i;
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    putchar('\n');
    return 0;
}

运行结果:


本来要设置的值为1,为什么结果如此诡异,数组元素的值全部变成了16843009??
其实原因也很简单,前面我们已经说过,memset函数是以字节为单位进行操作的,而每一个int占了四个字节(机器不同,int的长度也有可能不同),因此,memset函数会将int元素的每一个字节的值设置为1,表示成二进制就是:

<nobr> a[i]=224+216+28+20=16843009 </nobr>

通过前面的两个例子,证明memset函数不能实现除char外类型数组的整体初始化。
全部评论

相关推荐

点赞 评论 收藏
分享
吃不饱的肱二头肌很想退休:tnnd 我以为选妹子呢,亏我兴高采烈的冲进来😠
投递快手等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务