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

如何在C++中实现mystrcpy?程序出现内存访问违规故障

解决你的mystrcpy内存访问违规问题

看起来你的自定义字符串复制函数因为几个细节错误,加上可能的目标缓冲区内存未分配,导致了控制台崩溃的问题,我来帮你梳理和修复:

问题拆解

1. 字符串结束符的位置错误

你的循环逻辑结束后,i的值刚好等于源字符串s的长度(比如s是"test",strlen(s)是4,循环执行i=0到3,结束后i=4)。但你用了c[++i]=NULL;,这会把结束符写到c[5]的位置——这不仅多偏移了一位,还会直接导致如果目标缓冲区c的容量刚好是strlen(s)+1时,出现越界写入,触发内存访问违规。另外,字符串结束符应该用字符型的'\0',而不是指针常量NULL。

2. 循环内重复计算字符串长度(效率问题)

strlen(s)每次调用都会遍历整个字符串直到找到结束符,在循环条件里反复调用会额外消耗性能,建议先把长度缓存到变量里。

3. 目标缓冲区c未正确分配内存

从你提到的Persoana类包含char *nume;成员来看,最大的可能性是你调用mystrcpy时,nume是未初始化的野指针或者只指向NULL,没有为它分配足够容纳源字符串内容+结束符的内存空间,这是引发内存访问违规的核心原因之一。

修正后的mystrcpy实现

#include <iostream>
#include <cstring>

int mystrcpy(char *c, const char* s) {
    // 先做空指针检查,避免传入空指针导致崩溃
    if (c == nullptr || s == nullptr) {
        return -1; // 用返回值标识错误状态
    }
    
    const int len = std::strlen(s);
    int i;
    // 复制源字符串的每个字符
    for(i = 0; i < len; ++i) {
        c[i] = s[i];
    }
    // 在正确的位置写入字符串结束符
    c[i] = '\0';
    
    std::cout << c << std::endl;
    return 0;
}

调用时的关键注意事项

在Persoana类中使用这个函数时,必须先为nume分配足够的内存:

class Persoana {
public:
    char* nume;
    
    Persoana() : nume(nullptr) {} // 构造函数初始化指针为空
    
    ~Persoana() {
        delete[] nume; // 析构函数释放内存,避免泄漏
    }
};

// 调用示例
int main() {
    Persoana p;
    const char* src = "Doe John";
    // 分配足够的内存:源字符串长度 + 1(给结束符)
    p.nume = new char[std::strlen(src) + 1];
    mystrcpy(p.nume, src);
    
    // 后续使用...
    
    return 0;
}

额外建议

在C++中,手动管理C风格字符串很容易出现内存问题,更推荐使用std::string来替代char*,比如把Persoana类的char *nume;改成std::string nume;,这样不需要自己实现复制逻辑,也能避免内存泄漏和访问违规的问题。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:47:35