memset函数的应用
函数的原型,参数和返回值
memset 函数是C语言的一个标准库函数,定义在<string.h>
和memory.h
头文件中(如果是c++那么它也定义在<cstring>
头文件中)。它的功能是将一块内存中的前n个字节设置为特定的值。它的原型如下:
void *memset(void *str, int c, size_t n);
void * __cdecl memset(void *_Dst,int _Val,size_t _Size);
参数说明:
s
:指向要设置的内存空间。c
:要设置的值。虽然这是一个int类型的值,但只有其低8位会被用来设置内存块,因此它通常用于设置字节值(0-255)。n
:要设置的字节数。
返回值:
- 返回参数
s
的值,即一个指向内存块的指针。
常见用法
memset 函数可以用来对任何类型的数据进行初始化,只要它们在内存中是连续存储的。下面给出一些常见的用法示例:
- 初始化数组:如果想要将一个数组中的所有元素都初始化为0或者其他某个值,可以使用 memset 函数。例如:
int arr[10];
memset(arr, 0, sizeof(arr)); // 将arr数组中的10个元素都初始化为0
- 清空字符串:如果想要将一个字符串变量清空,即将其内容全部设置为’\0’,可以使用memset函数。例如:
char str[20] = "Hello world";
memset(str, '\0', sizeof(str)); // 将str字符串中的20个字符都清空
- 设置内存块:如果想要将一块内存中的某些字节都设置为某个值,可以使用memset函数。例如:
struct student {
char name[20];
int age;
float score;
};
struct student stu;
memset(&stu, -1, sizeof(stu)); // 将stu结构体中的所有字节都设置为 0xff
效率和安全性
memset 函数是一个简单而高效的函数,它可以快速地对一块内存进行赋值操作。它比使用循环语句或者赋值语句逐个赋值要快得多。它也比使用 memcpy 函数或者 strcpy 函数复制一个相同值的源数据要快得多。
但是,memset函数也有一些缺点和风险。首先,它只能对内存进行字节级别的赋值,不能对更高级别的数据类型进行赋值。例如,如果想要将一个int数组中的所有元素都赋值为 1,不能使用 memset(arr, 1, sizeof(arr))
,因为这样会导致每个元素都变成 16,843,009(0x01010101) 。正确的做法是使用循环语句或者赋值语句逐个赋值。
其次,它不能保证对齐和字节序的一致性。不同的编译器和平台可能会有不同的对齐方式和字节序规则,这可能会影响到 memset 函数对内存赋值的结果。例如,在 小端字节序(Little Endian) 的系统中,如果想要将一个int变量赋值为 0x12345678,不能使用memset(&x, 0x12345678, sizeof(x))
,因为这样会导致 x 变成 0x78787878。正确的做法是使用直接赋值语句 x = 0x12345678
。
利用 memset 函数的特性,在 OI/ACM 竞赛中我们使用 memset 函数初始化数组,使数组每个元素为一个极小值或极大值。例如:
int nums[5];
memset(nums, 0x7f, sizeof(nums));
运行结果:
2139062143
2139062143
2139062143
2139062143
2139062143
int nums[5];
memset(nums, 0x80, sizeof(nums));
运行结果:
-2139062144
-2139062144
-2139062144
-2139062144
-2139062144
可以给一个数组赋极大值和极小值,但是char数组不适用这个方法,char只有1个字节(C/C++)
memset()函数的范围为 0~0xff
,且只会对1个字节进行赋值,剩下的字节由上一个字节复制过来。
因此如果赋 0,会将一段内存全部置为 0,如果赋 0x7f,就会赋一个极大值;如果赋 0x80,就会赋一个为负数的极小值;如果赋0xff,就会赋一个为-1的值。
负数在计算机在以补码的形式存在所以-1的二进制为 11111111,0xff的二进制为 11111111
附表:
memset 设置的值 | int类型的值 | memset 设置的值 | int类型的值 |
---|---|---|---|
0 | 0 | 80 | -2139062144 |
1 | 16843009 | 81 | -2122219135 |
2 | 33686018 | 82 | -2105376126 |
3 | 50529027 | 83 | -2088533117 |
4 | 67372036 | 84 | -2071690108 |
5 | 84215045 | 85 | -2054847099 |
6 | 101058054 | 86 | -2038004090 |
7 | 117901063 | 87 | -2021161081 |
8 | 134744072 | 88 | -2004318072 |
9 | 151587081 | 89 | -1987475063 |
A | 168430090 | 8A | -1970632054 |
B | 185273099 | 8B | -1953789045 |
C | 202116108 | 8C | -1936946036 |
D | 218959117 | 8D | -1920103027 |
E | 235802126 | 8E | -1903260018 |
F | 252645135 | 8F | -1886417009 |
10 | 269488144 | 90 | -1869574000 |
11 | 286331153 | 91 | -1852730991 |
12 | 303174162 | 92 | -1835887982 |
13 | 320017171 | 93 | -1819044973 |
14 | 336860180 | 94 | -1802201964 |
15 | 353703189 | 95 | -1785358955 |
16 | 370546198 | 96 | -1768515946 |
17 | 387389207 | 97 | -1751672937 |
18 | 404232216 | 98 | -1734829928 |
19 | 421075225 | 99 | -1717986919 |
1A | 437918234 | 9A | -1701143910 |
1B | 454761243 | 9B | -1684300901 |
1C | 471604252 | 9C | -1667457892 |
1D | 488447261 | 9D | -1650614883 |
1E | 505290270 | 9E | -1633771874 |
1F | 522133279 | 9F | -1616928865 |
20 | 538976288 | A0 | -1600085856 |
21 | 555819297 | A1 | -1583242847 |
22 | 572662306 | A2 | -1566399838 |
23 | 589505315 | A3 | -1549556829 |
24 | 606348324 | A4 | -1532713820 |
25 | 623191333 | A5 | -1515870811 |
26 | 640034342 | A6 | -1499027802 |
27 | 656877351 | A7 | -1482184793 |
28 | 673720360 | A8 | -1465341784 |
29 | 690563369 | A9 | -1448498775 |
2A | 707406378 | AA | -1431655766 |
2B | 724249387 | AB | -1414812757 |
2C | 741092396 | AC | -1397969748 |
2D | 757935405 | AD | -1381126739 |
2E | 774778414 | AE | -1364283730 |
2F | 791621423 | AF | -1347440721 |
30 | 808464432 | B0 | -1330597712 |
31 | 825307441 | B1 | -1313754703 |
32 | 842150450 | B2 | -1296911694 |
33 | 858993459 | B3 | -1280068685 |
34 | 875836468 | B4 | -1263225676 |
35 | 892679477 | B5 | -1246382667 |
36 | 909522486 | B6 | -1229539658 |
37 | 926365495 | B7 | -1212696649 |
38 | 943208504 | B8 | -1195853640 |
39 | 960051513 | B9 | -1179010631 |
3A | 976894522 | BA | -1162167622 |
3B | 993737531 | BB | -1145324613 |
3C | 1010580540 | BC | -1128481604 |
3D | 1027423549 | BD | -1111638595 |
3E | 1044266558 | BE | -1094795586 |
3F | 1061109567 | BF | -1077952577 |
40 | 1077952576 | C0 | -1061109568 |
41 | 1094795585 | C1 | -1044266559 |
42 | 1111638594 | C2 | -1027423550 |
43 | 1128481603 | C3 | -1010580541 |
44 | 1145324612 | C4 | -993737532 |
45 | 1162167621 | C5 | -976894523 |
46 | 1179010630 | C6 | -960051514 |
47 | 1195853639 | C7 | -943208505 |
48 | 1212696648 | C8 | -926365496 |
49 | 1229539657 | C9 | -909522487 |
4A | 1246382666 | CA | -892679478 |
4B | 1263225675 | CB | -875836469 |
4C | 1280068684 | CC | -858993460 |
4D | 1296911693 | CD | -842150451 |
4E | 1313754702 | CE | -825307442 |
4F | 1330597711 | CF | -808464433 |
50 | 1347440720 | D0 | -791621424 |
51 | 1364283729 | D1 | -774778415 |
52 | 1381126738 | D2 | -757935406 |
53 | 1397969747 | D3 | -741092397 |
54 | 1414812756 | D4 | -724249388 |
55 | 1431655765 | D5 | -707406379 |
56 | 1448498774 | D6 | -690563370 |
57 | 1465341783 | D7 | -673720361 |
58 | 1482184792 | D8 | -656877352 |
59 | 1499027801 | D9 | -640034343 |
5A | 1515870810 | DA | -623191334 |
5B | 1532713819 | DB | -606348325 |
5C | 1549556828 | DC | -589505316 |
5D | 1566399837 | DD | -572662307 |
5E | 1583242846 | DE | -555819298 |
5F | 1600085855 | DF | -538976289 |
60 | 1616928864 | E0 | -522133280 |
61 | 1633771873 | E1 | -505290271 |
62 | 1650614882 | E2 | -488447262 |
63 | 1667457891 | E3 | -471604253 |
64 | 1684300900 | E4 | -454761244 |
65 | 1701143909 | E5 | -437918235 |
66 | 1717986918 | E6 | -421075226 |
67 | 1734829927 | E7 | -404232217 |
68 | 1751672936 | E8 | -387389208 |
69 | 1768515945 | E9 | -370546199 |
6A | 1785358954 | EA | -353703190 |
6B | 1802201963 | EB | -336860181 |
6C | 1819044972 | EC | -320017172 |
6D | 1835887981 | ED | -303174163 |
6E | 1852730990 | EE | -286331154 |
6F | 1869573999 | EF | -269488145 |
70 | 1886417008 | F0 | -252645136 |
71 | 1903260017 | F1 | -235802127 |
72 | 1920103026 | F2 | -218959118 |
73 | 1936946035 | F3 | -202116109 |
74 | 1953789044 | F4 | -185273100 |
75 | 1970632053 | F5 | -168430091 |
76 | 1987475062 | F6 | -151587082 |
77 | 2004318071 | F7 | -134744073 |
78 | 2021161080 | F8 | -117901064 |
79 | 2038004089 | F9 | -101058055 |
7A | 2054847098 | FA | -84215046 |
7B | 2071690107 | FB | -67372037 |
7C | 2088533116 | FC | -50529028 |
7D | 2105376125 | FD | -33686019 |
7E | 2122219134 | FE | -16843010 |
7F | 2139062143 | FF | -1 |