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

strcpy_s、strcat_s使用报错及指针使用正确性咨询

C语言字符串拼接函数报错及指针使用问题解答

问题代码

char* CreateString(char* string1, char* string2) {
    
    int length = strlen(string1) + strlen(string2);

    // Allocate memory for the resulting string
    char* result = malloc((length) * sizeof(char)); 

    // Concatenate the two strings
    strcpy_s(result, sizeof result, string1);
    strcat_s(result,sizeof result, string2);
    return result;
}

问题说明

想实现两个字符串拼接,但调用strcpy_s和strcat_s时触发报错,仅使用CRT库时能正常运行。同时作为指针新手,不确定这段代码里指针的使用是否正确。

错误原因和修正方案

1. strcpy_s/strcat_s参数错误是核心问题

sizeof result获取的是指针变量本身的大小(32位系统为4字节,64位为8字节),并非你分配的内存空间大小。strcpy_s这类安全函数会严格检查目标缓冲区的可用空间,发现空间远小于需要复制的字符串长度时,直接触发报错。

另外原代码分配内存时没给字符串结束符\0预留位置,就算用非安全的strcpy也会出现内存越界,属于未定义行为。

修正后的代码:

char* CreateString(const char* string1, const char* string2) {
    // 加1是为字符串结束符'\0'预留位置
    int total_len = strlen(string1) + strlen(string2) + 1;

    // 分配内存后必须检查是否成功,避免空指针操作
    char* result = malloc(total_len * sizeof(char));
    if (result == NULL) {
        return NULL;
    }

    // 第二个参数传入实际分配的内存长度
    strcpy_s(result, total_len, string1);
    strcat_s(result, total_len, string2);
    return result;
}

2. 指针使用的几个注意点

  • malloc返回的指针一定要检查是否为NULL,内存分配失败时会返回空指针,直接操作会导致程序崩溃。
  • 输入参数改成const char*更合理,因为函数不会修改输入的两个字符串,符合C语言的const正确性规范。
  • 调用这个函数后,记得在合适的地方用free()释放result指针,避免内存泄漏。

3. 关于CRT库能运行的原因

CRT库的某些配置下可能关闭了安全函数的参数检查,或者对内存越界的检测不严格,但这属于侥幸情况,代码本身的问题依然存在,绝对不能依赖这种运行结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:11:01