C++ Don';我不明白为什么会出现异常:访问冲突读取位置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

我正在处理一个使用c字符串的类,我创建了一个成员函数,该函数返回调用对象(c字符串)的长度。当我运行代码时,我得到 Project5.exe中0x0F63F6E0(ucrtbased.dll)处引发异常:0xC0000005:访问冲突读取位置0x00000000。 我想不出怎么解决这个问题。我不太确定我需要多少代码,但希望下面的代码片段就足够了

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()