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

