0xC0000005:访问冲突执行位置0x00000000。当试图访问multimap的插入函数时

时间:2016-07-07 19:55:02

标签: c++ stl function-pointers

我正在为USACO培训页面中的一个问题编写代码,当我尝试调试代码时:

#include <iostream>
#include<fstream>
#include<string>
#include<map>
#include<math.h>
using namespace std;
int translate(string &s) {
    int n = s.length();
    int result = 0;
    for (int i = 0; i < s.length(); i++) {
        int n1 = 0;
        if (s.at(i) == 'Q' || s.at(i) == 'Z') {
            return -1;
        }
        switch (s.at(i)) {
        case 'A':
        case 'B':
        case'C':
            result = result + 2 * pow(10, n-1);
            n--;
            break;
        case 'D':
        case 'E':
        case'F':
            result = result + 3 * pow(10, n - 1);
            n--;
            break;
        case 'G':
        case 'H':
        case 'I':
            result = result + 4 * pow(10, n - 1);
            n--;
            break;
        case 'J':
        case 'K':
        case 'L':
            result = result + 5 * pow(10, n - 1);
            n--;
            break;
        case 'M':
        case 'N':
        case 'O':
            result = result + 6 * pow(10, n - 1);
            n--;
            break;
        case 'P':
        case 'R':
        case 'S':
            result = result + 7 * pow(10, n - 1);
            n--;
            break;
        case 'T':
        case 'U':
        case 'V':
            result = result + 8 * pow(10, n - 1);
            n--;
            break;
        case 'W':
        case 'X':
        case 'Y':
            result = result + 9 * pow(10, n - 1);
            n--;
            break;
    }
    }
    return result;
}
bool mycompare(int n, int m) {
    string a, b;
    a = to_string(n);
    b = to_string(m);
    if (a < b) {
        return true;
    }
    else return false;
}
int main() {
    bool(*ptr)(int, int);
    typedef multimap<int, string, bool(*)(int, int)> mmid;
    mmid pairs(ptr);
    string s1;
    ifstream inFile("dict.txt", ios::in | ios::binary);
    while (cin>>s1) {
        int f =translate(s1);
        pairs.insert(mmid::value_type(f, s1));
    }
    int m;
    cin >> m;
    multimap<int, string>::iterator it;
    while (true) {
        it = pairs.find(m);
        if (it != pairs.end()) {
            cout << it->second << endl;
            pairs.erase(it);
        }
        else {
            break;
        }
    }


    return 0;
}

当我尝试输入&#34; ANDY HARRY&#34;时,当它处理到第二个条目时,

pairs.insert(mmid::value_type(f, s1));

在这一行,它给出了代码0xC0000005:访问冲突执行位置0x00000000。我的代码出了什么问题?为什么它不是在第一个条目而是在第二个条目上给我错误消息?感谢。

1 个答案:

答案 0 :(得分:3)

我认为问题在于此代码:

tbsCertificate

在第一行中,您定义了一个名为bool(*ptr)(int, int); mmid pairs(ptr); 的函数指针,但是您将其保留为未初始化。这意味着当您使用ptr初始化pairs时,您将使用垃圾比较函数指针初始化它。

要解决此问题,请传入您要使用的实际比较功能。例如:

ptr

此外,此代码非常可疑:

mmid pairs(mycompare);

请注意multimap<int, string>::iterator it; it = pairs.find(m); 的类型与multimap的类型不匹配,因此没有先验理由怀疑此迭代器可以正常工作。请考虑一下:

pairs