memset清零数组的坑

(40) 2023-10-20 16:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说memset清零数组的坑,希望能够帮助你!!!。

函数声明:

void *memset(void *s, int c, size_t n)

函数解释:将s中当前位置后面的n个字节 ,用 c 替换并返回 s

  • s -- 指向要填充的内存块。
  • c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式
  • n -- 要被设置为该值的字符数。

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

使用注意:

  • 在给int型数组赋初值时,只有初值为0或-1时有效
int  a1[10];
memset(a1, 0, sizeof(a1));
memset(a1, -1, sizeof(a1));

这是因为memset的实现时,会把填充内存的值转换成无符号字符形式

int型(默认占4字节)数组在内存的排布示意如下

memset清零数组的坑_https://bianchenghao6.com/blog__第1张

memset 是按字节赋值,即使给它int类型数,它也是只取该数最低位的一个字节来赋值。0的二进制数都是0-1的二进制数都是1,这样取成无符号数最后的一个字节就是下面两值,即这块内存是全0或是全1

00000000
11111111

所以给非单字节的数组或内存清零时,都是这个问题,只有0和-1是正确的期望值。

  • 在给字符串赋值时,注意int c的取值范围是0~255(unsigned char)

给字符串赋初值,本身就是该库函数的使用场景,只需知道c的取值是无符号char型就行,对应字符的ASCII码。

函数原型(C标准库):


void *(memset) (void *s,int c,size_t n)
{
	const unsigned char uc = c;    
	unsigned char *su;
	for(su = s;0 < n;++su,--n)
		*su = uc;
	return s;
}

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复