《C库 — memset函数的用法》
1.memset函数原型
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。(注意:会去修改内存得值,如果内存是只读,使用memset会出错)
重点需要注意一个细节:memset是以byte来填充的,也就是一个字节(8bit)一个单位来填充。
因此:如果int array[10]; memset(array, 1, 10);然后再把array的值打印出来,会得到一个错误的值。因为int是4个字节,因此再int类型中1的表现形式为“00000000000000000000000000000001”,然后将这32位填充1个byte中,高位被舍弃,也就是“00000001”,然后再填充一次就变成“0000000100000001”。那么array[0]其实在内存中存储的就是“00000001000000010000000100000001”。
2.示例
例1:memset是以字节为单位进行填充的
通过以上简单得例程,编译运行后理论上我们想要得得到得结果是array[0] = 1。
实际上:
将int array[10];
修改成:
char array[10];
结果就是我们想要得。
例2:memset会去修改内存中的值,去修改只读内存会造成段错误
运行结果:
因为char *s = “zhuangquan”是字符指针指向字符串常量。
C语言中定义为常量的值,是不允许被修改的,这是一个规则。如果有修改需求,就不要定义为常量,而是定义为变量。
在运行时,常量字符串会被存储在静态存储区,这段空间的特性就是只读的,任何修改属操作,均会引起整个程序崩溃。这也是C语言保证常量不可修改的一个手段。
(用const int i定义出来的也是常量,define定义的也是常量。包括‘A’以及ASCII表里面的以及0x01这些都是常量。都属于只读)
将*s修改成s[]就可以了
运行结果:
3.memset的函数实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?