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所代表的字符。

版权声明:本文为博主原创文章,未经博主允许不得转载。

memset()函数及其作用

1. memset()函数原型是extern void *memset(void *buffer, int c, int count)        buffer:为指针或是数组,         ...
  • qq_27522735
  • qq_27522735
  • 2016年11月28日 10:39
  • 40832

memset对数组的初始化

花了半个下午,总结了一下memset对int,long long,char型数组的初始化。//0x(零和英文字母x)是十六进制的前缀(十六进制不区分大小写) //memset对字节赋值 #includ...
  • windrises
  • windrises
  • 2015年06月14日 01:09
  • 1742

指针数组、数组指针、memset填充问题

函数原型 memset(dist , val,size); char test[]
  • zhong_sheng_
  • zhong_sheng_
  • 2014年05月26日 10:49
  • 1696

浮点与memset

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

关于C++ memset函数使用的问题

1. 关于该函数 函数原型:  memset(void *s,int ch,size_t n)       函数说明:       memset函数是计算机中C/C++语言函数。将s所指向的某一块内存...
  • wangwei6125
  • wangwei6125
  • 2017年06月17日 22:26
  • 207

字符数组赋值,以及memset用法注意

1,字符数组赋值 char a[10]; 怎么给这个数组赋值呢? 1、定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如char a[10];...
  • yu12345678900
  • yu12345678900
  • 2013年05月11日 22:10
  • 1523

Memset 初始化问题

本文学习内容转自: http://blog.csdn.net/wdkirchhoff/article/details/41512271 http://www.cnblogs.com/handsome...
  • yexiaohhjk
  • yexiaohhjk
  • 2016年10月01日 16:57
  • 1299

memset头文件的使用

太嫩。。。。。      注意的是,memset是对字节进行操作,所以程序如果改为   int array[5] = {1,4,3,5,2};   for(int i = 0; i   ...
  • ljf_study
  • ljf_study
  • 2017年05月14日 10:25
  • 746

C++中memset()函数的用法详解

头文件:cstring 或 memory 话说刚开始使用memset的时候一直以为memset是对每一个int赋值的,心里想有了memset还要for循环对数组进行初始化干嘛。但其实memset...
  • lyj2014211626
  • lyj2014211626
  • 2017年03月23日 23:52
  • 2287

memset函数导致内存泄露的问题

我们一般常说的内存泄漏是指堆内存的泄漏。程序从堆中分配的内存使用完毕后必须显式释放,否则这块内存就不能被再次使用,即这块内存泄漏了。内存泄漏导致软件在运行过程中占用越来越多的内存,程序的效率会越来越低...
  • sogouauto
  • sogouauto
  • 2015年06月03日 10:02
  • 1481
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:memset
举报原因:
原因补充:

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