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

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

相关文章推荐

MemSet41b4

  • 2012年12月02日 16:39
  • 399KB
  • 下载

透彻分析C/C++中memset函数

透彻分析C/C++中memset函数     在C语言中,经常需要对内存进行操作,里面涉及很多函数,但是memset函数的使用有一点需要大家格外注意,这也是我在做项目时遇到过的一个问题,调试了很久...

memset,memcpy,strcpy 的用法

  • 2014年05月22日 10:16
  • 26KB
  • 下载

使用memset、memcpy等函数需要包含string.h而不是strings.h

问题: frm_package.c中调用了memset()和memcpy()函数,但是没有包含相应的头文件,编译时出现错误: dingq@wd-u1110:~/hwsvn/2sw/1prj_lin...

memset查看内存共享工具

  • 2011年10月24日 13:11
  • 11KB
  • 下载

memset的初浅体会

  • 2010年03月04日 10:00
  • 43KB
  • 下载

老生常谈,正确使用memset

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

memset清空一个结构类型的变量或数组

将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。需要的头文件 or 函数原型 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:memset
举报原因:
原因补充:

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