使用结构数组分配不正确的内存

时间:2013-06-11 01:31:09

标签: c++

我之前发布过此问题,但似乎无法找到解决方案。因此,为了解决这个问题,我将再次发布精致的描述。非常感谢您的帮助。

我想要做的是从文本文件中连续阅读。此文本文件包含3种类型的行:

  1. 包含单词“start”的行,表示特定测试用例结果的开始
  2. 包含PASS或FAIL或PWU或FWU以及附带数据的行
  3. 包含单词“stop”的行,表示测试用例结果的结束
  4. 我遇到的问题是dataRowPointerdataRowPointer是一个struct数组。它的指针在main函数中声明,并通过引用传递给以下函数。

    当我调用*dataRowPointer = new DataRow[MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET];时,我可以在调试器中看到第一个数组元素dataRowPointer [0]已在内存中正确分配。但是,第二个,第三个和所有其他元素未正确分配,因为调试器在内存中将它们显示为0xcccccccc。

    这影响了我的其他函数调用getDataRow( line, loc, tcsPointer, dataRowPointer );,其中包含与(*dataRowPointer)[dataRowIndex].tcSetNum = testCaseSetID;类似的行。

    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 == "PASS" || word == "PWU" || word == "FWU" || word == "FAIL" )
                    {   
                           startStop = false;
                           break;   
                    }
                    else if( word == "start" )
                    {   
                            dataRowIndex = 0;
                        *dataRowPointer = new DataRow[MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET];
                            initializeDataRowPointer( dataRowPointer );
    
                        testCaseSetID = captureTestCaseSetNumber( line, tcsPointer );
                        getHeaderRow( myfile, loc );
    
                        startStop = true;
                        break;
                    }
                    else if ( word == "stop" )
                    {   tcsNumber++;
    
                        *dataRowPointer = NULL;
                        startStop = true;
                        break;
                    }
                    else
                    {   startStop = false;  }
                }
    
                if( !startStop )
                {   
                    (*dataRowPointer)[dataRowIndex].tcSetNum = testCaseSetID;
                    getDataRow( line, loc, tcsPointer, dataRowPointer );
                    dataRowIndex++;
                }
        }
    

    非常感谢任何帮助。

    注意:我理解我的代码很脆弱(如果文本文档没有启动或停止等等),它包含错误的代码(使用全局变量等)。但是我想在继续之前先解决这个问题。并且请尝试忽略*dataRowPointer = NULL;语句中的else if,一旦修复此错误,我会将其更改为更有用的内容。

    编辑按要求提供struct DataRow的代码和函数InitializeDataRowPointer的代码:

    的DataRow:

    struct DataRow
    {
        std::string tcSetNum;
        std::string class_PassFail;
        std::string rfPort;
        float temp;
        float margin;
    };
    

    InitializeDataRowPointer:

    void initializeDataRowPointer( DataRow** dataRowPointer )
    {
        DataRow newDataRow = {"a", "a", "a", 0.0, 0.0 };
        for ( int i = 0; i < MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET; i++ )
        {   (*dataRowPointer)[i] = newDataRow;  }
    }
    

1 个答案:

答案 0 :(得分:0)

好的,你展示的代码应该有效;见证这个程序,它确实有效。

#include <string>
#include <cstdio>

#define MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET 10

struct DataRow
{
  std::string tcSetNum;
  std::string class_PassFail;
  std::string rfPort;
  float temp;
  float margin;
};

static void
initializeDataRowPointer(DataRow** dataRowPointer)
{
  DataRow newDataRow = { "a", "a", "a", 0.0, 0.0 };
  for (int i = 0; i < MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET; i++)
    (*dataRowPointer)[i] = newDataRow;
}

static void
f(DataRow** dataRowPointer)
{
  *dataRowPointer = new DataRow[MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET];
  initializeDataRowPointer(dataRowPointer);
}

int
main(void)
{
  DataRow *ptr;
  f(&ptr);

  for (int i = 0; i < MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET; i++)
    std::printf("%d %s %s %s %f %f\n", i,
                ptr[i].tcSetNum.c_str(),
                ptr[i].class_PassFail.c_str(),
                ptr[i].rfPort.c_str(),
                ptr[i].temp,
                ptr[i].margin);

  return 0;
}

我的结论是问题出在其他地方,我认为你最好的选择是采取你的完整程序并逐步从中删除代码,直到你拥有仍然可以解决问题的最小程序。一旦你有了,如果问题不明显,请提出一个新问题,使用这个较小的程序作为示例代码。那时我们更有可能帮助你。