调用自定义strAppend函数后无法打印const char*的问题求助
问题原因及修复方法
为什么最后一条printf没输出?
其实是数组越界写内存,意外覆盖了str1指向的字符串常量:
- 你定义
char str[] = "hi:";的时候,编译器只会给这个数组分配刚好能装下"hi:\0"的空间——也就是4个字节。这意味着str最多只能放3个有效字符加结束符。 - 调用
strAppend(str, str1)时,str1是"hello ",strlen(str1)算出来是6,加上原str的长度3,拼接完的字符串需要3+6+1=10个字节才能装下(还要留位置放结束符'\0'),但str只有4个字节的空间。 - 这时候强行往str里塞超过它容量的内容,就会越界写到相邻的内存里。而你的程序内存布局中,str1指向的"hello "刚好就在str的隔壁,被越界写入的内容(尤其是最后加的'\0')直接盖没了,导致str1指向的内容变成了空字符串,最后一条printf自然打不出东西。
怎么修复?
方法一:给str分配足够大的固定空间
直接把str定义成足够装下拼接后内容的数组,比如:
char str[20] = "hi:"; // 20字节足够应付这次的拼接需求
方法二:用动态内存分配(更灵活)
如果不确定最终字符串的长度,用动态内存分配更稳妥,修改后的代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> // 修改函数,返回动态分配的拼接后字符串 char* strAppend(const char *s1, const char *s2) { size_t len1 = strlen(s1); size_t len2 = strlen(s2); // 分配总长度+1的空间,留位置放结束符 char *result = malloc(len1 + len2 + 1); if (!result) return NULL; // 别忘了检查内存分配是否成功 strcpy(result, s1); strcat(result, s2); return result; } int main() { const char *str = "hi:"; const char *str1 = "hello "; printf("str1: %s\n", str1); char *appendedStr = strAppend(str, str1); if (appendedStr) { printf("appended str: %s\n", appendedStr); free(appendedStr); // 动态分配的内存一定要记得释放 } printf("str1: %s\n", str1); return 0; }
内容的提问来源于stack exchange,提问作者user10293779
相关产品推荐
相关产品推荐

