0

运行代码时,我在 Visual Studio 中收到此错误:fileIO_experiment.exe 中 0x0028457b 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000018

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

这是我的代码:

在主函数中:

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++ 更多,我提前道歉,我仍然是新手。

帮助将不胜感激。谢谢你!

4

2 回答 2

0

dataRowPointer 是一个 NULL 指针,只有 startStop 为 false 时才进入 if 语句。您初始化此指针的代码中的唯一点将 startStop 设置为 true 并离开循环(中断)。你不可能在你的 if 中访问一个有效的指针。

于 2013-06-10T18:58:13.507 回答
0

这是一段非常脆弱的代码。如果您的移动不止一个“开始”,那么您就会泄漏并丢弃内存。你开始后停止,你泄露了你的指针——哎呀,你总是泄露你的指针。你需要重新思考你是如何创造你的记忆的。

您的指针在停止时为 0,但您设置了一个哨兵来捕捉它,所以它可能没问题。

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

于 2013-06-10T18:50:05.017 回答