0xC0000005:访问冲突读取位置0x00000000。重载==运算符的问题

问题描述 投票:-1回答:1

[嗨,我目前正在为我正在学习的数据结构课程编写程序,并且正在研究重载提取运算符的一部分。我当前收到错误访问冲突读取位置0x00000000。当我尝试将两个“我的字符串对象”相互比较时。 MyString对象本质上是c字符串,这是类定义

    class MyString {
    private:
        char* str;
    public:
        MyString();
        MyString(const char*);
        MyString(const MyString&);
        ~MyString();

        int length() const;
        void read(istream&, char);
        static const int MAX_INPUT_SIZE = 127;

        MyString& operator=(const MyString&);
        MyString& operator +=(const MyString&);
        friend MyString operator +(const MyString&, const MyString&);


        char operator[](int location)const;
        char& operator[](int location);

        friend ostream& operator<<(ostream&, const MyString&);
        friend istream& operator>>(istream&, MyString&);

        friend bool operator <(const MyString& left, const MyString& right);
        friend bool operator <=(const MyString& left, const MyString& right);
        friend bool operator >(const MyString& left, const MyString& right);
        friend bool operator >=(const MyString& left, const MyString& right);
        friend bool operator ==(const MyString& left, const MyString& right);
        friend bool operator !=(const MyString& left, const MyString& right);

    };
}
#endif

这是重载的==运算符,引发异常

bool operator ==(const MyString& left, const MyString& right) {
        return strcmp(left.str, right.str) == 0;
    }

这是我进行比较的上下文,假设temp是有效的MyString对象。

for (int i = 0; i < sizeof(cs_measure::Measure::unitStrings); i++) {
            if (cs_measure::Measure::unitStrings[i] == temp) {
                readMe.unit = i;
                in >> readMe.unit;
            }
        }

这是在for循环中引用的数组

const MyString Measure::unitStrings[] =
    { "dram", "tsp", "tbsp", "oz", "cup", "pint",
     "qt", "gal", "peck", "bushel", "barrel", "acre_ft" };

这是我第一次在堆栈溢出中发帖,所以我遗漏了可能对解决此问题有用的任何重要信息,请告诉我,我们将很乐意为您提供帮助。

c++ arrays extraction
1个回答
0
投票

如注释中所述,sizeof(cs_measure::Measure::unitStrings)not数组cs_measure::Measure::unitStrings中的项目数。它是数组在内存中占用的字节数。

由于以字节为单位的大小几乎肯定大于元素数,因此您将在循环中超出边界访问数组,从而导致未定义的行为。

您可以使用以下方法获取内置数组中的项目数

std::size(cs_measure::Measure::unitStrings)

自C ++ 17起(如果未包含任何容器库标头,则可能需要#include<iterator>

或者如果您不能使用C ++ 17,则可以定义自己的版本,尽管C ++ 17标准版功能更强大。 (来自cppreference.com):

template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}
© www.soinside.com 2019 - 2024. All rights reserved.