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

