欢迎大家来到IT世界,在知识的湖畔探索吧!
在C语言中,memset() 函数用于将一段内存区域填充为指定的值。它定义在 <string.h> 头文件中,常用于初始化内存块(如数组、结构体)或设置特定字节模式。
1.函数原型
void *memset(void *str, int c, size_t n);
欢迎大家来到IT世界,在知识的湖畔探索吧!
str: 指向要填充的内存块的指针
c: 要填充的值(以 int 形式传递,但实际按无符号字符处理)
n: 要填充的字节数,以字节的形式填充
返回值: 返回原始指针 str
2.实际应用示例
示例1:初始化数组为0
程序
欢迎大家来到IT世界,在知识的湖畔探索吧!#include <stdio.h> #include <string.h> int main() { int arr[5]; int i = 0; // 将arr所有字节设为0(等价于全0初始化) memset(arr, 0, sizeof(arr)); // 验证结果 for (i = 0; i < 5; i++) { printf("%d ", arr[i]); // 输出: 0 0 0 0 0 } return 0; }
运行结果
欢迎大家来到IT世界,在知识的湖畔探索吧!
示例2:设置字符串的特定部分
程序
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello World!"; printf("原始: %s\n", str); // 输出: Hello World! // 将前5个字符替换为'-' memset(str, '-', 5); printf("修改后: %s\n", str); // 输出: ----- World! return 0; }
运行结果
示例3:初始化结构体
程序
欢迎大家来到IT世界,在知识的湖畔探索吧!#include <stdio.h> #include <string.h> typedef struct { int id; char name[20]; float score; } Student; int main() { Student s; // 将结构体所有字节设为0 memset(&s, 0, sizeof(Student)); printf("ID: %d\nName: %s\nScore: %.1f\n", s.id, s.name, s.score); // 输出全0/空值 return 0; }
运行结果
3.关键注意事项
1.按字节操作
memset 逐字节填充内存。若对非字符类型(如 int 数组)填充非0值,可能得到意外结果:
程序
#include <stdio.h> #include <string.h> int main() { int nums[3]; int i = 0; memset(nums, 1, sizeof(nums)); // 验证结果 for (i = 0; i < 3; i++) { printf("%d ", nums[i]); } return 0; }
运行结果
memset`按字节设置内存值,而`int`由多个字节组成。将每个字节设为`1`导致每个`int`值为`0x0`(),而非预期的`1`。因此,输出是五个相同的较大整数(),而非全0或全1。
2.适合场景
- 清零内存(memset(ptr, 0, n))
- 设置字符数组的字节模式
- 初始化结构体/内存块为全0
3.性能优势
相比循环赋值,memset 通常由底层优化,处理大内存块时效率更高。
提示:初始化非字符类型时,优先考虑 calloc()(自动清零)或手动循环赋值,避免 memset 的字节填充陷阱。
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/142109.html