美好的一天, 请有人帮忙吗?我试图反转一个指针数组成员。
string::string(char *c)
{
int i =0;
while ((c[i] != '\0'))
{
i++;
}
_lenght= i;
_aString=*&c;
}
void string::reverse() //Requirements specify to have this argument
{
for(int i=0; i<_lenght/2; i++)
{
std::swap(_aString[i], _aString[_lenght-i-1]);
}
}
我收到了运行时错误。
这是我的主要功能
int main(){
string a;
std::cout << "a is " << a << "\n";
string b("12345");
string c("12345",3);
std::cout << "c is " << c << "\n";
c = a;
a = b;
std::cout << "a is " << a << "\n";
b.reverse();
std::cout << "a is " << a << "\n";
return 0;
}
我得到的错误是
UnisaLesson1.exe中0x00fd6710处的未处理异常:0xC0000005:访问冲突写入位置0x00fdfd08。
对不起,我还是个新手。
答案 0 :(得分:1)
问题是
_aString=*&c;
这是一种奇怪的写作方式
_aString=c;
这样_aString
只是指向函数参数;这个类不管理字符串的内存(如std::string
那样),但是指的是在别处管理的外部字符串。
在您的测试用例中,该字符串是一个字符串文字 - 不可修改。因此,尝试修改它,就像reverse
那样,会给出未定义的行为;如果你很幸运,违反访问权限;如果你运气不好,数据损坏或其他一些不必要的运行时行为。
如果你的类应该管理内存,那么它需要在构造函数中分配它。假设这个赋值是内存管理的练习(否则,只需使用std::string
),你需要像
_aString = new char[_lenght];
std::copy(c, c+_lenght, _aString);
并且不要忘记Rule of Three:
delete [] _aString
您也可以考虑将_lenght
的拼写修改为_length
。