关于c库函数memset的理解

memset函数原型为void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
实际上就是用来给一片内存区域进行初始化,比说创建数组
int * save=new int[10];
对save数组初始化不想采用循环赋值的形式,就可以用memset库函数。
测试代码如下:

#include<iostream>
#include<stdio.h>

using namespace std;
int main(){
    
	int * save = new int[10];

	for (int test = -2; test < 2; test++)
	{
		memset(save, test, 10 * sizeof(int));

		for (int i = 0; i < 10; i++)
			cout << save[i] << "  ";
		cout << endl;
	}
	
	system("pause");
	return 0;
}

测试结果如下:
在这里插入图片描述
从上面可以看到,只有 0 和 -1 被正确赋值,其他的出现了状况,原因是memset是对每一个字节进行赋值,而计算机系统中每一个int占据了好几个字节的空间
在32位系统中,每一个int的大小为4个字节,负数在计算机中的表示是补码形式进行存储的(正数原码和补码相同,也可认为整数在计算机中的存储方式为补码)
首先来看1的表示
0000 0001|0000 0001|0000 0001|0000 0001
转换为十进制数就是16843009
对于-2在计算机中的表示为
1111 1110|1111 1110|1111 1110|1111 1110
转换为十进制数就是-16840010
而0在计算机中的表示为
0000 0000|0000 0000|0000 0000|0000 0000
1在计算机中的表示为
1111 1111|1111 1111|1111 1111|1111 1111
0和1在计算机中的表示高字节和低字节相同,导致转换为十进制数后值并不会发生变化,所以通常memset初始化数组时使用0或-1 比较好

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值