关于memset使用的一点小插曲

本文解析了一个关于memset函数使用的常见误解,客户尝试使用memset填充0x8000值到内存中,但并未达到预期效果。文章详细解释了memset函数的工作原理,并指出了问题所在。
        最近在工作中与客户公司的开发人员进行开发交流时遇到了一个简单的小问题,觉得有必要记录下来。
        问题说来其实很简单,如下一句代码:
        memset (buff, 0x8000, 300*300);
        将0x8000值写入buff指向的内存中,即从buff的起始地址开始,依次填入300*300个0x8000。
        客户公司的开发人员用这句代码生成的程序没有出现他们预期的效果,于是找到我问为什么(我在以前提供给他们一个实现相同功能的库函数),我看了之后告诉他们这句代码有错误,可是他们一直没有想明白。
        其实错误很的原因就在于他们没有搞清楚memset函数用法的实质,memset是一个对内存进行单字节操作的函数,它对内存区域进行赋值时是按照一个字节一个字节进行的,所以它只会把0x8000的低字节赋给每个字节。因此,上面的代码执行后,内存区域的值是:
        0x00 0x00 0x00…………………………
        而不是他们期望的:
        0x8000 0x8000 0x8000……………………
内容概要:本文介绍了一个基于MATLAB实现的多目标粒子群优化算法(MOPSO)在无人机三维路径规划中的应用。该代码实现了完整的路径规划流程,包括模拟数据生成、障碍物随机生成、MOPSO优化求解、帕累托前沿分析、最优路径选择、代理模型训练以及丰富的可视化功能。系统支持用户通过GUI界面设置参数,如粒子数量、迭代次数、路径节点数等,并能一键运行完成路径规划与评估。代码采用模块化设计,包含详细的注释,同时提供了简洁版本,便于理解和二次开发。此外,系统还引入了代理模型(surrogate model)进行性能预测,并通过多种图表对结果进行全面评估。 适合人群:具备一定MATLAB编程基础的科研人员、自动化/控制/航空航天等相关专业的研究生或高年级本科生,以及从事无人机路径规划、智能优化算法研究的工程技术人员。 使用场景及目标:①用于教学演示多目标优化算法(如MOPSO)的基本原理与实现方法;②为无人机三维路径规划提供可复现的仿真平台;③支持对不同参数配置下的路径长度、飞行时间、能耗与安全风险之间的权衡进行分析;④可用于进一步扩展研究,如融合动态环境、多无人机协同等场景。 其他说明:该资源包含两份代码(详细注释版与简洁版),运行结果可通过图形界面直观展示,包括Pareto前沿、收敛曲线、风险热图、路径雷达图等,有助于深入理解优化过程与结果特性。建议使用者结合实际需求调整参数,并利用提供的模型导出功能将最优路径应用于真实系统。
`memset` 是 C 语言中一个常用函数,其原型为 `void *memset(void *src, int value, size_t n)`,这里 `src` 可以是数组名,也可以是指向某一内存空间的指针;`value` 为要填充的值;`n` 为要填充的字节数,通常为 `sizeof(s)`。该函数的功能是将指针变量 `src` 所指向的前 `n` 字节的内存单元用一个“整数” `value` 替换,注意 `value` 是 `int` 型。`src` 是 `void*` 型的指针变量,所以它可以为任何类型的数据进行初始化[^3]。 ### 使用示例 #### 数组初始化 ```c #include <string.h> #include <stdio.h> int main() { char str[20]; char *pt = str; memset(pt, 0, sizeof(str)); // 将str数组初始化为0 printf("str: %s\n", str); return 0; } ``` #### 结构体初始化 ```c #include <string.h> #include <stdio.h> struct MyStruct { int num; char ch; }; int main() { struct MyStruct s; memset(&s, 0, sizeof(s)); // 将结构体所有成员清零 printf("s.num: %d, s.ch: %c\n", s.num, s.ch); return 0; } ``` ### 使用注意事项 - **值转换**:`value` 参数虽然是 `int` 类型,但实际使用时会被转换为 `unsigned char`(0 - 255)[^2]。 - **非字符类型**:对于非字符类型的数组(如 `int`、`float` 等),使用 `memset` 要特别小心。因为 `memset` 是按字节填充的,对于多字节类型的数据,可能无法达到预期的初始化效果。 - **类含有虚函数表**:在 C++ 中,如果类含有虚函数表,使用 `memset` 将破坏虚函数表,后续调用虚函数时将出现异常[^3]。 - **类中含有 C++ 类型的对象**:例如,类中定义了一个 `vector` 的对象,因为在构造函数体的代码执行之前就对 `vector` 对象完成了初始化,假设 `vector` 在它的构造函数里分配了内存,使用 `memset` 会破坏 `vector` 对象的内存[^3]。 - **安全性**:确保不会越界访问内存,`memset` 是一个底层内存操作函数,使用时需要特别注意类型和边界条件[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值