关于memset的小实验
- memset是包含在<string.h>的函数,用来给字符数组赋值。
- 然而人们常常把它拿来给整型变量赋值。
void *MEMSET (void *dstpp, int c, size_t len)
-
memset是一个返回通用指针的函数,返回的地址便是输入的地址
-
int c表示对这块内存的赋值
-
len是内存的长度
-
memset是按照字节来赋值的,但是int类型是4个字节的。
简单的情况
-
c = -1时,-1的原码是10000000 00000000 00000000 00000001,反码是11111111 11111111 11111111 11111110,补码是1111111 11111111 11111111 11111111(32位)
-
猜测截取最低8位一个字节,在内存中最低位的地址编号小和书写顺序相反,相当于截取4字节内存的前8位,对每个字节赋值。
-
笔者这里指的是【小端机器】。
#include <stdio.h> //#include <stdlib.h> #include <string.h> int main(int argc, char* argv[]) { int a[4]; memset(a, 128, sizeof(a)); printf("%d\n", a[0]); printf("%d\n", a[1]); printf("%d\n", a[2]); printf("%d\n", a[3]); return 0; }
-
每个字节都赋值11111111而int类型读取4个字节,故此时int的值为11111111 11111111 1111111 11111111是-1的补码,所以a[0]=1。
-
同样的0赋值后也是0(-0和+0的补码均是00000000 00000000 00000000 00000000)。
其他情况
- 例如c=3 原码 00000000 00000000 00000000 00000011 反码 00000000 00000000 00000000 00000011 补码 00000000 00000000 00000000 00000011截取8位 00000011(正数三者一致)
- 拷贝四次00000011 00000011 00000011 00000011 反码 00000011 00000011 00000011 00000011原码 00000011 00000011 00000011 00000011 为
- 运行一下,确实如此。