尝试访问全局定义的Struct指针时,读取访问冲突和写入访问冲突

时间:2017-10-10 21:57:12

标签: c++ visual-studio pointers struct

我的问题可能有点大而愚蠢。我还在学习C ++。 所以请耐心等待。

我正在为一个简单的5级CPU实现一个模拟器。

我在functions.h中定义了一个结构体,并在全局命名空间中用functions.cpp中的不同指针实例化了结构体。我有多个函数可以写入和读取这个结构,而不会将这些结构作为参数提供。但是,我得到“NullPtr”错误和“读取访问冲突”,我一直在尝试修复它几个小时。我不知道发生了什么。

这是我的代码在概述中的样子。

functions.h:

namespace functions{

typedef array<int, 2> src_reg;

struct instruction_info {

    string instruction_type = "NOP";
    string instruction_string;
    vector<src_reg> source_registers;
    int literal = NULL;
    bool update_zero = true;
    array<int,2> destination_register;
    int target_memory_address = NULL;
    int target_memory_data = NULL;          
};


struct stage_struct {

    bool psw_access = true;
    instruction_info* input_instruction;
    instruction_info* output_instruction;
    bool stalled = false;
    int program_counter = 4000;
    bool finished = false;

};

}

然后我继续实例化它们,它们看起来像这样:

functions.cpp

using namespace functions;
stage_struct stage_memory_p;
stage_struct stage_write_back_p;
stage_struct* stage_memory = &stage_memory_p;
stage_struct* stage_write_back = &stage_write_back_p;

然后我从所有阶段打电话给他们。但它会抛出异常。

int functions::decode_rf() {

    if ((stage_decode_rf->input_instruction->instruction_string == "NOP"))
        return 0;
    ...
}

这会给我“读取访问冲突”错误。我是C ++的新手,我真的不明白这意味着什么。

我遇到了另一个与此类似的问题。这也是相同代码的一部分。

functions.h:

typedef struct Code_Line {

    int file_line_number = NULL;
    int address = NULL;
    string instruction_string = "";

}code_line;


struct code_memory {
    array<code_line, 1000> array_code_line;
};

functions.cpp:

code_memory *instructions;
code_line *code_lines;

int functions::initialize_i_memory(string file_name) {

    ifstream insts;
    string one_line;

    insts.open(file_name);

    if (!insts) {
        cout << "There was an error opening the instructions file" << endl;
        exit(1);
    }

    cout << "File loaded successfully. Now writing them into instruction memory" << endl;

    int cnt = 0;

    while (getline(insts, one_line)) {

        instructions->array_code_line[cnt].address = (4000 + (cnt * 4));
        instructions->array_code_line[cnt].file_line_number = (cnt + 1);
        instructions->array_code_line[cnt].instruction_string = one_line;
        cnt++;
    }

    insts.close();
    return cnt;
}

然后我从main()函数调用它:

int total_instructions = initialize_i_memory("input.txt");

它现在抛出“写入访问冲突”错误。

有人可以解释一下为什么会这样吗?

如果有人试图以更一般的方式解决问题并提供解决方案,我将非常感激。

如果可能,请随时发布有关此内容的任何博客/教程。

0 个答案:

没有答案