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

C语言实现带中间空格的字符串拼接时malloc内存分配大小疑问

问题解答

结论

你确实需要将内存申请大小调整为8字节,当前程序正常运行属于未定义行为的侥幸表现,并非编译器容错,不具备可移植性,存在严重安全隐患。

计算逻辑说明

以你输入的"ttt"和"yyy"为例:

  • 第一个字符串长度3,第二个长度3
  • 插入1个分隔空格,占用1字节
  • 末尾的\0结束符占用1字节
    总需要的内存大小为 3 + 3 + 1 + 1 = 8 字节,原申请的7字节无法容纳所有内容,属于缓冲区溢出。

为什么当前程序可以正常运行

C语言标准本身不会对数组访问、堆内存访问做边界检查,大部分malloc实现为了内存对齐,会给你分配比申请值更大的对齐块(比如常见的16字节对齐规则,你申请7字节时实际分配了16字节的内存块),你溢出的1字节刚好落在了冗余的对齐区域,没有踩踏到其他正在使用的内存地址,所以暂时没有出现崩溃、乱码的问题,但这种表现完全不可靠,一旦运行环境变化、或者程序复杂度提升,大概率会触发异常。

正确的内存分配规则

申请的堆内存大小 = 最终拼接后所有有效字符的总长度 + 1字节(存储字符串结束符\0)。
对你的需求来说,公式应该调整为:

size_t total_size = len1 + len2 + 2; // 2 = 1个空格 + 1个结束符
char* str = malloc(total_size * sizeof(char));

现有代码的优化建议

  • 你已经在开头计算了len1、len2两个变量,后续不需要反复调用strlen(str1),直接用缓存的len1即可,避免重复遍历字符串提升效率
  • 拼接结束后统一赋值结束符即可,不需要在循环内判断结束位置再赋值,逻辑更清晰:
// 空格位置直接用len1即可
str[len1] = ' ';
// 拷贝完str2后,直接在末尾加结束符
str[len1 + 1 + len2] = '\0';

内容的提问来源于stack exchange,提问作者Roni Jack Vituli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:06:03