You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:37:43