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
:要设置的字节数。
返回值:
常见用法
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 |