C语言strcat函数为动态分配内存的char*数组进行字符串拼接

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)也不会出错了

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值