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
相关产品推荐
相关产品推荐

