memset 的功能
memset 是一个常用的函数,一般在创建动态内存后,调用 memset 来将内存清空,避免内存中的残留信息造成问题。
memset 函数接口描述
memset 函数原型如下:
void *memset(void *s, int c, size_t n);
这里需要注意设置内存大小的参数 n 类型为 size_t,一般是 int 型。
一个使用引发的问题
p_buf = &ram_buffer
memset(p_buf, 0x0, BUFFER_SIZE);
ram_buffer 在链接脚本中设定,为内存中预留的一段区域。调试发现调用 memset 后,p_buf 的值也被清空。
解决问题所做的尝试
怀疑参数 size 指定大小,检查汇编指令,发现没有问题。
检查 size 的类型,检查通过。
怀疑 memset 的问题,重新编写 memset 后重试,问题仍旧存在。
怀疑是否内存映射不对,先检查芯片是否支持内存映射,然后检查内存映射配置,检查发现,内存映射错误。
最终通过修改设置,解决了这个问题。
反思
在这个问题的解决过程中,每一种不同的尝试代表着不同的怀疑,这其中有合理的,也有不合理的。从这些尝试中能够发现自己在解决问题时存在的不足,这种不足颇有点当局者迷的意味。回头再看,发现自己解决问题的方法不客观,没深入的分析问题就立马去尝试解决问题,试来试去花了很长时间才找到了问题的根源。
我想问自己——如何回答下面的问题:
- 该怀疑什么?
- 什么最可能出现问题?
- 不合理的怀疑有哪些?
- 能否将问题可能出现的地方以可能性进行排序?
这些问题值得深思!