C/C++中memset函数

正文学习参考http://baike.baidu.com/link?url=ZmSyY8ciB\_nJt9KM-W2fiEFJrC2mugFsLqRdY2b4pLe8rD\_jRXyN7\_pj0GBBD2bKyt6Xm-lpUlAO97H94dUYXa

1.memset函数之扬言和意义如下:

函数解释:将s所对的某平片内存中的前n个字节的情节尽装置也 ch
指定的 ASCII值
第一个价也指定的内存地址片的高低鉴于第三独参数指定,这个函数通常也新申请之内存做初始化工作,
返回值为指向s的指针。该函数针对数组而言只能用来数组的置0或-1,其他价值无效。其作用是以一如既往截内存块中填充某个给定的价值,它是对准较生之结构体或者数组进行清零操作的一样种植最抢方法。函数声明如下:

void * memset(void *s, int ch, size_t n);

memset 函数而已经用于初始化内存,例如:

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

 2.memset函数之大错误用法

(1)memset函数对数组而言,只能进行置0或者置(-1)操作,而无可知是别的数值。

  因为memset函数是对准单个字节进行操作,如果拿int
a[5]值为2,操作为:memset(a,2,sizeof(int)*5);因为他是整型数组,有四单字节,而每个字节都让赋值为2,即a[5]吃之每个元素的每个字节都于赋值为2(例如a[0]的二进制表示为00000010
00000010 00000010 00000010   , 所以输出十迈入制a[0]的价为
33686018);而(-1)的二进制表示为(11111111 11111111 11111111
11111111),因此置为(-1)不见面转其价值。

(2)memset(void *s, int key,size_t n)
中ch实际范围应该在0~~255。

(3)注意ch 和 n 的职不可知为反

3.memset的运情况比较

例如:将 char a[20] 进行清零的操作如下

memset(a,0,20*sizeof(char));      //将char a[20] 清零

(1)两种植状况下用memset函数的于

char buffer[4];
memset(buffer,0,sizeof(char)*4);                //将buffer[4] 清零
strcpy(buffer,"123");                    //将字符串 “123” 复制到 buffer中

//此时字符串的总长为4位(包括结尾的 ‘\0’ )
//因为拷贝的字符串将buffer全部覆盖,因此,此时的memset可以不需要

char buffer[20];
memset(buffer,0,sizeof(char)*20);
memcpy(buffer,"123",3);
//这一条的memset并不多余,memcpy并没把buffer全部覆盖,如果没有memset,
//用printf打印buffer会有乱码甚至会出现段错误。
//如果此处是strcpy(buffer,"123");便不用memset,
//strcpy虽然不会覆盖buffer但是会拷贝字符串结束符

(2)Demo如下:

#include <iostream>
using namespace std;

int main(void)
{
    char buffer[] = "Helloworld\n";
    cout << "Buffer before memset: " << buffer << endl;
    memset(buffer, '*', strlen(buffer));
    cout << "Buffer after memset: " << buffer << endl;
    system("pause");
    return 0;
}

result:

图片 1

 

 

PS:关于内存访问冲突问题

#include <iostream>
using namespace std;
int main()
{
    char *s="GoldenGlobalView";        //改为char s[] = "GoldenGlobalView";则没有问题
    memset(s,'G',6);                     //单步运行到这里会提示内存访问冲突
    printf("%s",s);
    getchar();
    return 0;
}

图片 2