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结构体中的所有字节都设置为-1

效率和安全性

memset函数是一个简单而高效的函数,它可以快速地对一块内存进行赋值操作。它比使用循环语句或者赋值语句逐个赋值要快得多。它也比使用memcpy函数或者strcpy函数复制一个相同值的源数据要快得多。

但是,memset函数也有一些缺点和风险。首先,它只能对内存进行字节级别的赋值,不能对更高级别的数据类型进行赋值。例如,如果想要将一个int数组中的所有元素都赋值为1,不能使用memset(arr, 1, sizeof(arr)),因为这样会导致每个元素都变成256(0x0101)。正确的做法是使用循环语句或者赋值语句逐个赋值。

其次,它不能保证对齐和字节序的一致性。不同的编译器和平台可能会有不同的对齐方式和字节序规则,这可能会影响到memset函数对内存赋值的结果。例如,在 小端字节序(Little Endian) 的系统中,如果想要将一个int变量赋值为0x12345678,不能使用memset(&x, 0x78, 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,如果赋0x3f,就会赋一个极大值,如果赋0x4f,就会赋一个为负数的极小值,如果赋0xff,就会赋一个0

负数在计算机在以补码的形式存在所以-1的二进制为 11111111

0xff的二进制为 00000000 00000000 00000000 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

愿此行,终抵群星!