memset()函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了memset()函数相关的知识,希望对你有一定的参考价值。

main()

int a[101];
int i;
memset(a,1,sizeof(a));
for(i=1;i<=100;i++)printf("%d ",a[i]);
system("pause");

为什么a[]不是1而是16843009.
按字节填什么意思,看不懂
如果要填为1要怎么写memset()函数
以字节为单位是什么意思
如果要填为1要怎么写memset()函数,这个是顶重要的问题

  1、memset是计算机中C/C++语言函数。将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值, 第二个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。

  函数介绍:void *memset(void *s, int ch, size_t n);

  2、函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

  memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

  3、范例:

  

参考技术A memset操作是以字节为单位的,如果把每个字节填充为1,就是memset(a, 1, sizeof(a));所以你打印出来的整型数是16843009,即0x01010101
如果你要让每个整型都是1,用最传统的办法,
for(i=0; i<101; i++)a[i]=1;本回答被提问者采纳
参考技术B memset是从a[0]开始赋值的,但是你打印的是a[1]开始的,所以a[0]中还是一个不确定的值。
所以显示就异常了。
以字节为单位是说,你填充的东西是要占一个字节的大小,比如给字符数组初始化,memset(a,‘0’,100);
参考技术C 什么意思啊,memset是一个把字符串换成一些特定字的函数

memset()函数中的坑

一 写在开头
1.1 本节内容
内存填充函数memset()中的坑。

二 函数原型

1 /* 来自man memset */
2 #include <string.h>
3 void * memset(void * s, int c, size_t n);

功能描述:memset()函数用常量c的值填充由指针s所指向的内存地址空间的前n个字节的内存空间。

DESCRIPTION : The memset() function fills the first n bytes of the memory area pointed to by s with the constant byte c.

 

参数:
void * s - 指向要被填充的内存空间的首地址
int c - 一个常量
size_t n - 要被填充的字节数

 

返回值:
memset()函数是有返回值的,从函数原型也可以看出来。memset()函数返回一个指向内存空间s的指针。

RETURN VALUE : The memset() function returns a pointer to the memory area s.

 

三 填坑运动
3.1 第一个坑
先举一个memset()正确的应用场景。下面的代码能够很好地运行,完全能够达到目的。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     char Queen[10];
 7 
 8     memset(Queen, G, sizeof(Queen));
 9 
10     return 0;
11 }

 

调用memset()函数之前:
(gdb) p Queen
$1 = "360[email protected]000000000024004"
调用memset()函数之后:
(gdb) p Queen
$2 = "GGGGGGGGGG"

 

如果Queen数组类型不是char而是int,结果会怎样?

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     int Queen[10];
 7 
 8     memset(Queen, G, sizeof(Queen));
 9 
10     return 0;
11 }

 

调用memset()函数之前:
(gdb) p Queen
$1 = {0, 0, 0, 0, 4195824, 0, 4195488, 0, -8352, 32767}
调用memset()函数之后:
(gdb) p Queen
$2 = {1195853639, 1195853639, 1195853639, 1195853639, 1195853639, 1195853639,
1195853639, 1195853639, 1195853639, 1195853639}


看到了吧!Queen数组全部被填充了一个相同的数字,但该数字却不是我们想要的‘G‘。为什么会这样?道理很简单,memset()函数是一个字节一个字节地填充数字的,你一个int类型变量在内存中占了4个字节(不同机器,int所占字节数不一样),不出错才怪!上一个例子之所以能够正确运行,是因为在我的机器上,一个char类型变量刚好占了一个字节。

 

怎么避免这个问题?下次记得在使用memset()函数对int型数组进行填充时,所能够使用的常量c的取值只能是0和-1。想想0和-1这两个数的二进制表示是怎样的,你就明白了为什么只能使用这两个数字了。

 

3.2 第二个坑
在成功避开第一个坑之后,你可能还会遇到第二个坑。比如说,你把上述的代码写成了下面的这个样子。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     int Queen[10];
 7 
 8     memset(Queen, -1, 10);
 9 
10     return 0;
11 }

 

调用memset()函数之前:
(gdb) p Queen
$1 = {0, 0, 0, 0, 4195824, 0, 4195488, 0, -8352, 32767}
调用memset()函数之后:
(gdb) p Queen
$2 = {-1, -1, 65535, 0, 4195824, 0, 4195488, 0, -8352, 32767}

 

怎么回事,为什么没有把Queen数组全部初始化为-1?因为memset()函数是一个字节一个字节地填充数的!第三个参数10表示的是数组Queen中有10个int型数据,它并不表示Queent数组在内存中所占的字节数!明白了吧!

 

怎么避免这个问题,很简单,将上述memset()调用改成如下的样子就好了

1 memset(Queen, -1, sizeof(Queen));

 

四 参考资料
1. man memset




























以上是关于memset()函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言 memset函数

c++这个memset()函数有啥用? memset(啥意思,啥意思,啥意思);

在JAVA中有没有象C语言里的memset函数

memset()函数及其作用

memset函数使用

memset函数