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:

 

 

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

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

转载于:https://www.cnblogs.com/runningRain/p/5930249.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: memset()函数是C/C++语言的一个库函数,可以用于将一段内存空间的内容设置为指定的值。 memset()函数的原型为: ```c void *memset(void *s, int c, size_t n); ``` 其,s是指向要设置的内存的指针;c是要设置的值,通常是一个无符号字符或者零;n是要设置的内存空间的大小。 memset()函数的作用是将一段内存空间的每个字节都设置为相同的值。可以用于初始化内存,或者将内存的内容清零。 使用memset()函数需要注意以下几点: 1. memset()函数只能用于字符数据类型或者无符号整型数据类型,即只能设置1字节大小的值。 2. 使用memset()函数时,需要知道要设置的内存空间的大小,以防止超出边界进行内存越界操作。 3. memset()函数是按字节进行设置的,所以对于非字符类型数据(如整数或浮点数),可能造成数据不符合预期。 示例代码: ```c #include <string.h> int main() { int arr[5]; memset(arr, 0, 5 * sizeof(int)); // 将arr内存空间设置为0 char str[20]; memset(str, 'A', 19); // 将str内存空间设置为'A' str[19] = '\0'; // 末尾添加'\0',形成一个字符串 return 0; } ``` 总之,memset()函数是一个能快速设置内存空间内容的函数,可以方便地进行内存初始化和内存清零操作。 ### 回答2: memset()函数是C语言的一个库函数,其原型如下: void *memset(void *ptr, int value, size_t num); memset()函数的作用是将指定内存空间的值设置为指定的值。其,ptr表示要设置的内存空间的起始地址,value表示要设置的值,num表示要设置的字节数。 memset()函数的返回值为void指针类型,即可以接受任何类型的指针。 使用memset()函数可以在一次调用批量设置内存空间的值,提高效率和代码的简洁度。 例如,下面的代码片段就是使用memset()函数将数组arr的所有元素设置为0: int arr[10]; memset(arr, 0, sizeof(arr)); 由于memset()函数设置的是字节数据,所以在设置非字符类型数据时需要小心。以一个int型数组arr为例,使用memset()函数将其所有元素设置为-1可能会出现错误。因为在某些机器上,-1的二进制表示并不是所有字节全为1,这会导致memset()函数设置的结果并非预期。 对于字符数组或字符串,可以使用memset()函数设置为0,即'\0',也可以使用strcpy()函数进行单个字符赋值,这样更为安全可靠。 总之,memset()函数是一个实用的函数,可以批量设置内存空间的值,提高代码的执行效率和简洁度。在使用时,需要注意数据类型和数据源的合法性,以避免出现错误。 ### 回答3: memset()函数是C/C++语言的一个库函数,主要用来对一段指定内存空间进行初始化。 其函数原型为: void* memset(void* ptr, int value, size_t num); 第一个参数ptr是一个指向某一块内存区域的指针,用来指定待初始化的内存空间。 第二个参数value是一个整数值,用来指定待初始化的值,其最常用的是0。 第三个参数num是一个整数值,用来指定待初始化的内存空间的字节数。 memset()函数的作用是将ptr指向的内存空间的每个字节都设置为value指定的值。一般来说,value为0时,可以用来将内存空间清零。 memset()函数通常用于对数组、字符串或结构体等数据类型的初始化。例如,当我们声明一个数组或字符串后,需要将其所有元素或字符都初始化为0,可以使用memset()函数。 以下是一个使用memset()函数进行数组初始化的示例: int num[5]; memset(num, 0, sizeof(num)); 以上代码将会把num数组的所有元素都初始化为0。 需要注意的是,memset()函数只能用来设置每个字节的值,并不能对较大的数据块进行初始化。此外,在使用memset()函数时,需要确保待初始化的内存空间不受限制并且是可访问的,否则可能会引发错误。 总结起来,memset()函数是C/C++常用的一个函数,主要用来对一段指定的内存空间进行初始化,提高程序的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值