给struct数组中的元素赋值时出错



我在visual studio中运行代码时得到此错误:在fileIO_experiment.exe中的0x0028457b处未处理异常:0xC0000005:访问违反读取位置0x00000018

我试图在我的一个函数中分配一个结构数组。指向该数组的指针在main中声明,但在名为getRow的函数中传递和使用。当我试图给struct数组中的元素赋值时,就会出现这个问题。

下面是我的代码:

在main函数中:

int main()
{
.
.
.
DataRow* dataRowPointer = 0;
dataRowIndex = 0;
while ( myfile.good() )
{
        getRow( myfile, &loc, tcsPointer, dataRowPointer );
        globalLineCounter++;        
}
.
.

函数getRow:

void getRow( std::istream& myfile, HeaderLocations* loc, TestCaseSet* tcsPointer, DataRow* dataRowPointer )
{
    std::string line;
    std::string word;    
    int currentLoc = 0;
    bool startStop = true;
    std::getline( myfile, line);        
    std::stringstream sline(line);
    while ( sline >> word )
    {
        if( word == "start" )
        {   
            dataRowIndex = -1;
            dataRowPointer = new DataRow[MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET];              //Declaration of array of DataRow structs
            initializeDataRowPointer( dataRowPointer );          // Setting all values of previous array to default values
            testCaseSetID = captureTestCaseSetNumber( line, tcsPointer );
            getHeaderRow( myfile, loc );
            startStop = true;
            break;
        }
        else if ( word == "stop" )
        {   tcsNumber++;
            dataRowPointer = 0;
            startStop = true;
            break;
        }
        else
        {   startStop = false;  }
    }
    if( !startStop )
    {   dataRowIndex++;
        dataRowPointer[dataRowIndex].tcSetNum = testCaseSetID;      // <-- PROBLEM OCCCURS HERE
        getDataRow( line, loc, tcsPointer, dataRowPointer );    }
}

dataRowIndex是全局变量。这只是暂时的,直到我修复这个代码。如果我的代码比c++更像C,我提前道歉,我还是个新手。

帮助将是非常感激的。谢谢你!

这是一段非常脆弱的代码。如果你有多于一个"开始",你就会泄漏并丢掉内存。你在启动后点击停止,你的指针就会泄漏——你总是泄漏你的指针。你需要重新思考如何创造你的记忆。

你的指针停止了,但是你设置了一个哨兵来捕捉它,所以它可能是好的。

这是可能的问题:如果所有进入的单词既不是停止也不是开始(或者您对字符串的比较不能正确工作)并且while(sline >> word)最终返回false,因为它没有数据或其他东西,您永远不会分配内存,然后尝试从!startStop If语句中读取它。这将导致NULL异常。

dataRowPointer是一个NULL指针,只有当startStop为false时才会输入if语句。在代码中初始化该指针的唯一点是将startStop设置为true并离开循环(break)。在if.

中访问有效指针是不可能的。