C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。要求dest指向的字符串必须首先具有足够空间存放src指向的字符串,但是如果dest指向的字符串是动态分配的内存那么在使用strcat函数时要特别注意,因为动态分配内存时会在分配内存的结尾(甚至是超过分配内存的结尾处)添加‘\0’,而strcat函数会将src指向的字符串内容添加在dest字符串中第一个出现‘\0’的字符位置(会替换掉‘\0’)并且在添加完src内容后在后面补充一个‘\0’,以表示字符串结尾。如果使用如下代码则会造成错误的结果
int strLen = 20;
char* dest = (char*)malloc(strLen * sizeof(char));
printf("length of dest is %d\n", strlen(dest));
char* src = "hello world";
strcat(dest, src);
printf("length of dest after strcat is %d, and its content is %s\n", strlen(dest),dest);
free(dest);//会出错
执行结果
可以看到分配内存后dest指向的字符串长度为30,并不是我们指定的20,而且strcat会将src字符串添加在dest的30字符(含)及后面,这时dest指向的字符串的实际长度已经是41了,并且可以看到30字符之前的字符串是乱码,是分配内存时的原始状态。并且动态分配的dest在使用完需要释放,这时释放的内存已经超过了我们之前申请的长度,会崩溃。
那么怎么避免这种情况呢,正确的代码如下
int strLen = 20;
char* dest = (char*)malloc(strLen * sizeof(char));
dest[0] = '\0';//这句是关键
printf("length of dest is %d\n", strlen(dest));
char* src = "hello world";
strcat(dest, src);
printf("length of dest after strcat is %d, and its content is %s\n", strlen(dest),dest);
free(dest);//不会出错
执行结果
free(dest)也不会出错了