memset

原创 2014年11月24日 17:33:23

综述

首先,memset是一个比较*疼的东西,主要原因是它当初被设计出来主要是用来为字符串(比如char型数组)赋值的,但是当大家把它拿来给其他类型(比如int,double等)赋值的话,就该*疼了——

头文件与函数原型

之所以说memset用来处理字符串,可以行它的头文件略见一斑

string.h

这显然是来处理字符串的啊。

void * memset (void * p,int c,size_t n);

由原型可以看出:指针p为所操作的内存空间的首地址,c为每个字节所赋的值,n为所操作内存空间的字节长度,也就是内存被赋值为c的字节数。

举例及注意事项

下面问题来了,memset究竟要注意什么?

举个例子:

char a[10];
memset(a, '\n', 10);
这个例子说明了将一个10个字节的char型数组全部赋值为10个'\n',这当然可以,因为memset本来就是处理字符或字符串的。


问题是如果处理其他类型呢?

再举个例子:

int a[10];
memset(a, 1, 10);

结果是什么呢?是将10个int型的数组a全部赋值为整数1吗?显然不是的。

我们不妨从底层来看:一个int有4个字节,也就是说数组a其实是一个连续40个字节的存储空间。而memset(a, 1, 10)代表将10个字节赋值为1,也就是说a[0] = a[1] = 0x01010101,a[2] = 0x01010000,a[3] = a[4] = ... = a[9] = 0。

所以,赋值显然是失败的。失败的根源就是memset本来就是用来处理字符,按照字节来操作的,所以对其他类型的数据操作一定要慎重!


不过初始化(赋0值)int型数组倒是可以的:

int a[10];
memset(a, 1, 10*sizeof(int));

号外

对赋值的理解:

<span style="font-size:18px;">char c = 1;</span>

对于上面的代码,我们可以这样理解——

(1)从实际内存操作上看,上面的代码表示对c代表的字节赋1;

(2)从逻辑内容上看,上面的代码表示将c赋值为ASCII值1所代表的字符。


int m = 7;
int n = 8;
int i;

int **a;	//用malloc申请建立二维数组

a = (int **) malloc(m * sizeof(int *));

for(i=0; i<m; ++i)
    a[i] = (int *) malloc(n * sizeof(int));


memset(a, 0, sizeof(int) * m * n);	//wrong!!!


此时对二维数组初始化赋值为0是不对的,因为用这种方式申请出来的二维数组不是连续的。(准确的说这是 存放有指向一维int型数组的指针的一维int*型数组)


但是

int a[7][8];
memset(a, 0, 7*8*sizeof(int));
对这种定义的二维数组是可以的。因为这种申请方式保证了数组内存地址是连续的。

号外(临时补充内容):

<span style="font-size:18px;">char c = 1;</span>

对于上面的代码,我们可以这样理解——

(1)从实际内存操作上看,上面的代码表示对c代表的字节赋1;

(2)从逻辑内容上看,上面的代码表示将c赋值为ASCII值1所代表的字符。

版权声明:本文为博主原创文章,欢迎转载欢迎传播,注不注明出处随你,只要对更多人有所帮助就行。 https://blog.csdn.net/puppylpg/article/details/41448237

浮点与memset

转载——C语言中float,double类型,在内存中的结构(存储方式) 2012-06-25 17:53 by 愤怒的青蛙, 592 阅读, 1 评论, 收藏, 编辑 最近在做一个数据格...
  • yuyin86
  • yuyin86
  • 2013-11-08 00:25:07
  • 2406

memset的坑

【起因】希望对各种类型的数组进行初始化,避免野值       【函数头文件】 提示:在linux中可以在terminal中输入 "man memset"进行查询         #includ...
  • cncnlg
  • cncnlg
  • 2015-05-23 11:22:12
  • 635

关于MEMSET的初始最大最小值

声明:也是摘自网上各路大神的。 memset的正规用法是只能用来初始化char类型的数组的,也就是说,它只接受0x00-0xFF的赋值。因为char是1字节,memset是按照字节赋值的,相当于把...
  • Night_13
  • Night_13
  • 2016-07-20 13:17:12
  • 470

老生常谈,正确使用memset

前段项目中发现一个问题,程序总是在某个dynamic_cast进行动态转换时出异常,查了半天才发现问题原来是出在memset的使用上,虽然问题本身显而易见,但当处于几十万行代码量级中时,就变得不太那么...
  • my_business
  • my_business
  • 2014-10-28 11:21:00
  • 84744

memset 、ZeroMemory和 “={0}” 三者区别

memset是以字节为单位,初始化内存块。 当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,比如char data[10]; memset(data, 1,...
  • ouyangjinbin
  • ouyangjinbin
  • 2016-04-05 18:13:39
  • 2659

不要对C++类对象或struct对象做memset操作

参考:http://stackoverflow.com/questions/1998752/which-one-to-use-memset-or-value-initialization-to-zer...
  • yasi_xi
  • yasi_xi
  • 2014-01-04 11:41:11
  • 3346

C语言中memset函数详解(很清晰易懂)

功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,   块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作   用 法: void *me...
  • PengPengBlog
  • PengPengBlog
  • 2016-09-20 10:23:35
  • 12513

memset函数与二维数组初始化的问题

今天在编写Levenshtein distance距离函数时用到二维数组,用memset对其初始化时发生了问题,直接代码: int** m = NULL; int i = 0,j = 0; ...
  • lvhaitao
  • lvhaitao
  • 2016-03-10 19:27:29
  • 5363

memset不能有效清空数组的原因

From: 问题:为什么这样用memset不能清零 #include #include int main() {    int i,a[100];    memset(a,0,100...
  • u011642774
  • u011642774
  • 2016-11-23 15:50:26
  • 1189

memset函数的使用原理

竞赛中经常使用memset函数进行数组初始化,但只能初始为0, -1。哪怕写成: int num[N]; memset(num, 1, sizeof(num)); num[0]也是个很大的数。 今...
  • xishisugan
  • xishisugan
  • 2017-02-01 20:35:44
  • 561
收藏助手
不良信息举报
您举报文章:memset
举报原因:
原因补充:

(最多只允许输入30个字)