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

VS2013中strcpy_s后调用strcat_s报错问题求助

解决VS2013中strcpy_s/strcat_s导致的程序崩溃问题

兄弟,我一眼就看穿你代码里的坑了——你在调用strcpy_s和strcat_s时,第二个参数传错了!这俩安全函数要求的是目标缓冲区的总容量,而不是当前字符串的长度,你现在传的strlen(hello)完全是无效值,直接导致缓冲区越界,程序可不就崩了嘛。

具体错误分析

  • 刚用new分配的hello内存是未初始化的,里面全是随机垃圾数据,strlen(hello)会一直读取内存直到碰到随机的'\0',得到的长度根本不是你实际分配的缓冲区大小,strcpy_s用这个值会直接导致写入越界
  • 就算strcpy_s侥幸成功了,strcat_s里传的strlen(hello)也只是当前"Hello"的长度,不是缓冲区总大小,strcat_s需要知道整个缓冲区能装多少才能判断拼接后会不会溢出,传错了必然触发错误

修正后的代码

#include <cstring>
#include <iostream>

int main() {
    // 字符串字面量是不可修改的,建议加const
    const char *stringOne = "Hello";
    const char *stringTwo = " There!";
    
    // 提前计算好总缓冲区大小,包含末尾的'\0'
    size_t totalBufferSize = strlen(stringOne) + strlen(stringTwo) + 1;
    char *hello = new char[totalBufferSize];
    
    // 第二个参数传缓冲区总大小,不是当前字符串长度
    strcpy_s(hello, totalBufferSize, stringOne);
    strcat_s(hello, totalBufferSize, stringTwo);
    
    std::cout << hello << std::endl;
    delete[] hello; // 别忘了释放动态分配的内存,避免泄漏
    return 0;
}

额外小建议

其实在C++里更推荐用std::string,完全不用手动管理内存和缓冲区大小,拼接直接用+运算符就行,代码简洁又安全:

#include <string>
#include <iostream>

int main() {
    std::string stringOne = "Hello";
    std::string stringTwo = " There!";
    std::string hello = stringOne + stringTwo;
    std::cout << hello << std::endl;
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:40:07