C++ Don';我不明白为什么会出现异常:访问冲突读取位置0x00000000
我正在处理一个使用c字符串的类,我创建了一个成员函数,该函数返回调用对象(c字符串)的长度。当我运行代码时,我得到 Project5.exe中0x0F63F6E0(ucrtbased.dll)处引发异常:0xC0000005:访问冲突读取位置0x00000000。 我想不出怎么解决这个问题。我不太确定我需要多少代码,但希望下面的代码片段就足够了C++ Don';我不明白为什么会出现异常:访问冲突读取位置0x00000000,c++,class,c-strings,strlen,C++,Class,C Strings,Strlen,我正在处理一个使用c字符串的类,我创建了一个成员函数,该函数返回调用对象(c字符串)的长度。当我运行代码时,我得到 Project5.exe中0x0F63F6E0(ucrtbased.dll)处引发异常:0xC0000005:访问冲突读取位置0x00000000。 我想不出怎么解决这个问题。我不太确定我需要多少代码,但希望下面的代码片段就足够了 MyString::MyString(const char* aString) //memberString is a c-string obje
MyString::MyString(const char* aString) //memberString is a c-string object
{
memberString = new char[length() + 1];
strcpy(memberString, aString);
}
int MyString::length() //Exception gets raised here
{
return strlen(memberString); //Exception gets raised here
}
你的问题是
需要length()
返回存储数据的大小memberString
需要创建memberString
length()
MyString::MyString(const char* aString) //memberString is a c-string object
{
memberString = new char[strlen(aString) + 1];
strcpy(memberString, aString);
}
当您使用调试器逐步处理代码时,
memberString
在异常发生的地方等于什么?从构造函数来看,memberString
似乎不是空终止的。您需要多少代码是空终止的。我们只能从这一位猜测,当然我们自己也无法复制它。在设置memberString
之前,请先计算length()
,它的读数为memberString
。欢迎来到UB世界。@freakish是对的。你应该把strlen(aString)
而不是length()