C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (一)+ https://developer.aliyun.com/article/1518728?spm=a2c6h.13148508.setting.14.4ab74f0eMP3Wpx
三、memset()
函数原型
void * memset ( void * ptr, int value, size_t num );
参数说明
- 第一个参数 ptr 为指针类型,表示要进行操作的内存的地址。如要对数组arr进行内存内容设置,则该参数的值为arr。
- 第二个参数 value 为要设定的内存的值。该值的数据类型是int型,但char值也是可以的。
- 第三个参数 num 为要设置值的内存的字节数。注意:是字节数,而不是元素的个数。如要改变两个int类型的值,num应为 8 ,而不是2.
使用说明
例如,有数组arr:[ 1 2 3 4 5 ]
要将其前两个元素值设定为0,则可使用memset函数:memset(arr, 0 , 8)
输出:[ 0 0 3 4 5 ].原理如下(以小端存储的形式展现):
arr数组为int类型,一个int为4字节、32bit,内存中的存储如下(二进制):
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
memset(arr, 0, 8),将前8个字节(2个int)置为0(其实每个比特位都被置为0了,但由于其它的比特位已经为0,故没有标出来)
但若使用 memset(arr, 1, 8),并不是把数组前两个元素置为 1 .因为memset()函数是针对内存中每个字节的,memset(arr, 1, 8)的实际作用是将前8个字节中的内容全部置为1.
00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01
00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01
03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
此时,前4字节按照int类型解析出来,结果为1000000010000000100000001,即16843009。
总结:
- int类型数组除了置0外,用memset置换成任何数都是错的。
- memset只适用于每个元素只占1个字节的数组,比如char型数组。因为memset的操作单位就是每个字节。只有char类型的数组不会出现错误。
使用示例
//示例来自cplusplus官网 /* memset example */ #include <stdio.h> #include <string.h> int main () { char str[] = "almost every programmer should know memset!"; memset (str,'-',6); //表示将从str开始,包括str向后6个字节的内存内容置为'-' puts (str); return 0; } //输出:------ every programmer should know memset!
四、memcmp()
函数原型
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
参数说明
- 比较ptr1和ptr2指针开始的num个字节。
- ptr1和ptr2分别是两个代表要比较的内存空间(一般是数组)的指针。
- num是要比较的字节数。(注意:不是元素个数)。
使用说明
- 返回值为整型,若返回值>0,则ptr1的内存长度大于ptr2;若返回值==0,则二者相等;若返回值<0,则ptr1的内存长度小于ptr2
使用示例
//示例来自cplusplus官网 /* memcmp example */ #include <stdio.h> #include <string.h> int main () { //创建两个要用作比较的数组 char buffer1[] = "DWgaOtP12df0"; char buffer2[] = "DWGAOTP12DF0"; //接受比较的结果 int n; //要比较的字节数为buffer1的长度 //两字符串的比较可以用strcmp(buffer1,buffer2)函数实现,原理大致相同。 n = memcmp ( buffer1, buffer2, sizeof(buffer1) ); if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2); else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2); else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2); return 0; }