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

C语言中对malloc分配后赋值为字面量的字符串执行strcat出现段错误如何解决

问题根源

你提供的代码存在两个核心错误,直接导致程序运行异常:

  • 指针赋值逻辑错误:John = "John" 这种写法不是把字符串内容拷贝到malloc申请的堆空间里,而是直接让John指针指向了只读数据段的字符串常量地址,原本malloc得到的堆地址直接丢失,还会导致后续strcat尝试向只读内存写入数据,直接触发段错误。
  • 目标缓冲区空间不足:就算你正确把内容拷贝到堆空间,你给John申请的4字节只能刚好放下"John"(含末尾\0结束符),没有预留拼接Carter所需的额外空间,也会导致越界写入触发未定义行为。

可行替代方案

方案1:保留malloc用法,修正拷贝逻辑+申请足够空间

优先推荐这种兼容性最高的方案,只需修正拷贝逻辑、提前计算申请足够的缓冲区大小即可:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
  // 申请总空间:"John"长度4 + "Carter"长度6 + 1个结束符,共11字节
  char* John = malloc(4 + 6 + 1);
  char* Carter = malloc(7);

  // 用strcpy把字符串内容拷贝到堆空间,不要直接给指针赋值字符串常量
  strcpy(John, "John");
  strcpy(Carter, "Carter");

  strcat(John, Carter);
  printf("%s\n", John);

  // 用完记得释放malloc申请的内存,避免内存泄漏
  free(Carter);
  free(John);
  return 0;
}

如果拼接的字符串长度不固定,可以先用strlen分别计算两个字符串的长度后再申请对应大小的空间,避免空间不足或者浪费。

方案2:使用asprintf自动分配空间(POSIX环境可用)

如果运行环境符合POSIX标准(Linux、macOS、部分嵌入式环境等),可以用asprintf自动计算所需空间、自动申请堆内存,不需要手动计算长度:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  char* John = "John";
  char* Carter = "Carter";
  char* res;
  // 自动申请对应大小的空间存储拼接结果
  asprintf(&res, "%s%s", John, Carter);
  printf("%s\n", res);
  free(res);
  return 0;
}

内容的提问来源于stack exchange,提问作者user6833628

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:09:03