今天在测试strcat 与strncat的用法时,发现了一个问题。在看一个mqtt工程的源代码时,看到了这样的写法:
mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(devid_len);
mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(devid_len);
strncat((int8 *)mqttPacket->_data + mqttPacket->_len, devid, devid_len);
当时查了一下strncat的用法:
当时比较在意说明那一块所指的src和dest内存区域不可以重叠,然后结合上面的工程源码猜想,难道是为了避免产生src和dest内存区域重叠这样的问题,所以在
在后面stcncat的时候把地址往后推了两个字节么?然后怀着这样的想法在VC上试了一下:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
char* buff1;
//char buff[] = "12345";
char* buff2 = "abcdf";
int main(void)
{
int i;
buff1 = malloc(10);
for(i=0;i<10;i++)
{
buff1[i]=0;
}
if(NULL==buff1) return -1;
buff1[0] = 49;
buff1[1] = 50;
strncat((char*)buff1,buff2,6);
printf("%s\n",buff1);
free(buff1);
buff1 = NULL;
return 0;
}
结果上图的在没有将buff1后移的情况下,buff2的字符串内容还是能成功的追加到buff1后面的。然后又回过头了看了对stcncat的描述:
那么是否可以理解,src认定的结尾就是‘\0’,但是想想写这个工程源码的肯定也是一位大牛了,这样的写法肯定是有原因的吧?目前个人认为即使在
功能性上来说,是否将dest的地址后移对结果并无影响,但是这样的写法可以让读者阅读起来更加容易理解上下文。