自定义memcpy复制字符串时触发write access violation错误,求排查
问题原因与解决方案
核心问题:字符串字面量的只读特性
你代码里的char* str1 = "onefive";是把指针指向了字符串字面量,这类数据在C/C++中通常被存放在程序的只读内存区域(比如.rodata段),不允许写入操作。当你的memcpy函数尝试往cdest(也就是str1指向的内存)写入数据时,就会触发写访问违规异常。
修复方案
把str1定义为可修改的字符数组,而不是指向字符串字面量的指针:
#include <string.h> #include <stdio.h> void* memcpy(void* dest, const void* src, size_t n) { char* cdest = (char*)dest; const char* csrc = (const char*)src; for (size_t i = 0; i < n; i++) // 用size_t匹配n的类型,避免类型不匹配 cdest[i] = csrc[i]; return cdest; } int main() { char str1[] = "onefive"; // 改为数组,内存分配在栈上,可修改 char* str2 = "two"; memcpy(str1, str2, strlen(str2)); printf("%s\n", str1); // 输出验证,结果为"twofive" return 0; }
额外注意点
- 原代码循环变量
i用int,但n是size_t(无符号整数类型),统一用size_t可避免类型不匹配的潜在问题。 - 必须包含
string.h头文件,否则strlen会因未声明引发编译警告或错误。
内容的提问来源于stack exchange,提问作者user10203585
相关产品推荐
相关产品推荐

