C语言通过函数拼接两个指针字符串无输出,代码存在什么问题?
问题排查及修复方案
存在的错误点
- 函数返回值类型错误:
concaten函数定义的返回值是char,但实际需要返回拼接后的字符串首地址,正确的返回值类型应为char* - 结果指针未分配内存:代码中
char *result仅定义了指针没有申请对应大小的堆空间,属于野指针,直接写入内容会触发内存访问异常 - 遍历赋值逻辑错误:两个循环中同时对索引变量自增两次,且没有移动原字符串的读取指针,会导致字符漏读、数组越界
- 缺失字符串结束符:C语言的字符串必须以
\0作为结束标识,代码拼接完内容后没有补充结束符,printf读取时无法识别字符串边界 - 内存泄漏隐患:如果在函数内申请堆内存,外部使用完后必须手动释放,否则会造成内存泄漏
修正后代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 函数返回值改为char* char* concaten(const char *str1,const char *str2); int main() { char *res = concaten("Code","blocks"); printf("%s",res); // 释放申请的堆内存 free(res); return 0; } char* concaten(const char *str1,const char *str2) { int i=0,j=0; // 计算两个字符串的长度,加1是为了存结束符\0 int len1 = strlen(str1), len2 = strlen(str2); // 申请对应大小的堆内存 char *result = (char*)malloc(sizeof(char)*(len1 + len2 + 1)); // 内存申请失败的异常处理 if(result == NULL) { return NULL; } // 拼接第一个字符串 while(str1[i]){ result[i] = str1[i]; i++; } // 拼接第二个字符串 while(str2[j]){ result[i+j] = str2[j]; j++; } // 补充字符串结束符 result[i+j] = '\0'; return result; }
运行后即可正常输出Codeblocks。
内容的提问来源于stack exchange,提问作者dv24680
相关产品推荐
相关产品推荐

