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

自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:40:44