最近在项目开发过程中,遇到了一个奇怪的问题:客户端修改设备名称时,设备名称的长度只能增加,设备名称长度缩短后,不生效。
设备名称 = “我们都是好孩子”;改为:“我们都是好孩子呀”,是可以的,读取出来也没有任何问题。在原来的基础上改为:“我们都“,客户端读取上来的还是”我们都是好孩子“。
让我很郁闷,然后我灵机一动,发现是memcpy搞的鬼,在复制字符串的时候长度出现了问题导致原有内存中的数据没有进行拷贝。
char name[14] = { 0 };
memcpy(name, "我们都是好孩子",14);
char name2[8] = { 0 };
memcpy(name2, "我们都是",8);
memcpy(name, name2,strlen(name2));
在这样使用name变量之后,发现name中存储的还是”我们都是好孩子“。
上述代码的问题在于:memcpy拷贝的长度出现了问题,导致name内存中从name[8]~name[13]都没有拷贝,有可能是原来存储的,也有可能是随机出现的字符。
下面给大家展示以下正确的代码:
char name[14] = { 0 };
memcpy(name, "我们都是好孩子",14);
char name2[8] = { 0 };
memcpy(name2, "我们都是",8);
//或者先使用memset清理以下name,然后再进行拷贝
snprintf(name, 14, "%s", name2);
不知道大家有什么好的方法处理呢?