c++ 当我尝试给结构赋值时,我得到了0x00000的写访问冲突

6gpjuf90  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(158)

作为学校实验的一部分,我需要读入唯一单词和它们与结构体对应的计数。我是结构体的新手,所以请容忍我。当我试图将当前单词的地址写入我的结构体的当前示例内部的字符指针时,我得到了访问冲突。我读到过这是由于解引用了一个nullptr。我试图理解这一点,但我就是不明白。我已经调整了数组的大小,就像这样在常规字符**数组接受新词。我不知所措,任何帮助将不胜感激。这里使用的输入文件只是随机单词由非字母字符分隔,但不是-或,这是我的代码:

#define _CRT_SECURE_NO_WARNINGS
#define _CRTDBG_MAP_ALLOC
#include <iostream>
#include <iomanip>
#include <fstream>
#include <limits>

using std::cin;
using std::cout;
using std::endl;
using std::setw;
using std::right;
using std::left;

using std::ifstream;
using std::ofstream;

const int BUFFER = 100; //I figure this buffer is big enough for any given word

struct Word_Count_STRUCT
{
    char* WORD = nullptr;
    int COUNT = 0;
};

int main()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    //Input for phrase
    ifstream iphrase;

    //Output to CSV (word count)
    ofstream o_count;

    //Word Exceptions
    ifstream xinWord;

    char wordbuffer[BUFFER] = { '\0' };
    char ch = 0;
    Word_Count_STRUCT** uniquewords = nullptr;
    Word_Count_STRUCT** temp = nullptr;

    int k = 0;
    int wordcount = 0;
    char* cword = nullptr; //Current Word
    bool NextWord_flag = false;
    bool interwordpunct = false;
    bool NewWord_flag = true;

    iphrase.open("C:\\Users\\me\\Desktop\\henroE.txt");
    if (iphrase.is_open())
    {
        while (!iphrase.eof())
        {
            
            iphrase.get(ch);

            if (isalpha(ch) || ch == '\'' || ch == '-')
            {
                wordbuffer[k] = ch;
                ++k;
                NextWord_flag = true;

                if (ch == '\'' || ch == '-')
                    interwordpunct = true;
            }
            if ( (NextWord_flag == true) && (!isalpha(ch)) && (interwordpunct == false) )
            {
                k = 0;
                cword = new char[strlen(wordbuffer) + 1];
                strcpy(cword, wordbuffer);
                memset(wordbuffer, '\0', sizeof(wordbuffer));
                for (int i = 0; (i < wordcount) && (NewWord_flag == true); ++i)
                {
                    
                    int cmp = _stricmp(uniquewords[i]->WORD, cword);
                    if (cmp == 0)
                    {
                        NewWord_flag = false;
                        uniquewords[i]->COUNT++;
                        delete[] cword;
                    }
                }
                if (NewWord_flag == true)
                {
                    temp = new Word_Count_STRUCT * [wordcount + 1]();
                    for (int i = 0; i < wordcount; ++i)
                    {
                        temp[i] = uniquewords[i];
                    }
                    delete[] uniquewords;

                    temp[wordcount]->WORD = cword;
                    temp[wordcount]->COUNT++;
                    uniquewords = temp;
                    ++wordcount;
                    NextWord_flag = false;
                }
                interwordpunct = false;
                NewWord_flag = true;

            }

        }
}

我在这一行得到一个错误:

temp[wordcount]->WORD = cword;

如果我注解掉上面的行,我也会得到一个关于int值COUNT的错误,所以我猜这与我初始化结构的方式有关,值得注意的是,如果我不初始化这个调用:

temp = new Word_Count_STRUCT * [wordcount + 1]();

而是将其保留为

temp = new Word_Count_STRUCT * [wordcount + 1];

我得到另一个访问冲突,但阅读而不是写入0xFFFFF...
不知所措,谢谢你的任何帮助:)

hgc7kmma

hgc7kmma1#

你犯了很多错误。首先,使用固定长度的字符缓冲区代替C++字符串已经过时了20年,除非你非常小心,否则会导致缓冲区溢出错误。
但这是一个问题:

temp = new Word_Count_STRUCT * [wordcount + 1]();
                for (int i = 0; i < wordcount; ++i)
                {
                    temp[i] = uniquewords[i];
                }
                delete[] uniquewords;

但是你在哪里分配了uniquewords?你声明了它。
您还可以在循环外分配cword,但在循环内删除它--这似乎也很可疑。
但是要注意,你分配的都是指针,我没有看到你实际分配了你试图放入数据的结构。

相关问题