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 |

愿此行,终抵群星!