最近在工作中与客户公司的开发人员进行开发交流时遇到了一个简单的小问题,觉得有必要记录下来。
问题说来其实很简单,如下一句代码:
memset (buff, 0x8000, 300*300);
将0x8000值写入buff指向的内存中,即从buff的起始地址开始,依次填入300*300个0x8000。
客户公司的开发人员用这句代码生成的程序没有出现他们预期的效果,于是找到我问为什么(我在以前提供给他们一个实现相同功能的库函数),我看了之后告诉他们这句代码有错误,可是他们一直没有想明白。
其实错误很的原因就在于他们没有搞清楚memset函数用法的实质,memset是一个对内存进行单字节操作的函数,它对内存区域进行赋值时是按照一个字节一个字节进行的,所以它只会把0x8000的低字节赋给每个字节。因此,上面的代码执行后,内存区域的值是:
0x00 0x00 0x00…………………………
而不是他们期望的:
0x8000 0x8000 0x8000……………………
问题说来其实很简单,如下一句代码:
memset (buff, 0x8000, 300*300);
将0x8000值写入buff指向的内存中,即从buff的起始地址开始,依次填入300*300个0x8000。
客户公司的开发人员用这句代码生成的程序没有出现他们预期的效果,于是找到我问为什么(我在以前提供给他们一个实现相同功能的库函数),我看了之后告诉他们这句代码有错误,可是他们一直没有想明白。
其实错误很的原因就在于他们没有搞清楚memset函数用法的实质,memset是一个对内存进行单字节操作的函数,它对内存区域进行赋值时是按照一个字节一个字节进行的,所以它只会把0x8000的低字节赋给每个字节。因此,上面的代码执行后,内存区域的值是:
0x00 0x00 0x00…………………………
而不是他们期望的:
0x8000 0x8000 0x8000……………………
本文解析了一个关于memset函数使用的常见误解,客户尝试使用memset填充0x8000值到内存中,但并未达到预期效果。文章详细解释了memset函数的工作原理,并指出了问题所在。
5万+

被折叠的 条评论
为什么被折叠?



