指针数组输出整数变量没有问题,但字符串均为空

时间:2018-08-11 23:19:44

标签: c++ arrays pointers

我是C ++新手,并使用Oldie McOldSchool数组和指针进行了分配。我现在已经在大约8到12个小时的累计小时中研究了这个特定的问题,有点想把我的脸推到砖墙上,而实际上不知道该怎么想。我希望得到SO专家的帮助!

我有以下课程

#include <iostream> 
#include <string> 
using namespace std;

#include "mainclass.h"
#include "mysubobject1.h"

const string dataString[] =
{
  "stringvalue,stringvalue,stringvalue,stringvalue,19,51,36,41,STUFF1",
  "stringvalue,stringvalue,stringvalue,stringvalue,19,52,37,44,STUFF2",
  "stringvalue,stringvalue,stringvalue,stringvalue,19,53,38,46,STUFF3",
  "stringvalue,stringvalue,stringvalue,stringvalue,19,54,39,49,STUFF1",
  "stringvalue,stringvalue,stringvalue,stringvalue,19,55,30,38,STUFF2",
};

MyObject* myObjectArray[5];
const string* dataArray[5];
int delimiterPositionArray[5][9];   
string tokenArray[5][9];
Stuff stuff;

void main() 
{
    MainClass* mainClass = new MainClass();

    dataArray[0] = &dataString[0];
    dataArray[1] = &dataString[1];
    dataArray[2] = &dataString[2];
    dataArray[3] = &dataString[3];
    dataArray[4] = &dataString[4];

    /*Parse the contents of string into Token array. I have this working and can share if necessary but trimmed it out to keep this easy to look at */

    for (int i = 0; i < 5; i++)
    {
        /* Logic to set the value of stuff goes here - it's very simple and trimmed for ease of reading */
        mainClass->add(tokenArray[i][0], tokenArray[i][1], tokenArray[i][2], tokenArray[i][3], stoi(tokenArray[i][4]), stoi(tokenArray[i][5]), stoi(tokenArray[i][6]), stoi(tokenArray[i][7]), stuff);
   }

    cout << "TEST" << endl;
    cout << mainClass->myObjectArray[0] << endl;

    }


    void MainClass::add(string string1, string string2, string string3, string string4, int int1, int int2, int int3, int int4, Stuff stuff)
   {

    MyObject myObject;
    if (stuff == STUFF2) {
    MySubObject1 myObject;
    myObject.SetStuff(stuff);
    }
    myObject.SetString1(string1);
    myObject.SetString2(string2);
    myObject.SetString3(string3);
    myObject.SetString4(string4);
    myObject.SetInt1(int1);
    int* intArray[] = { &int2, &int3, &int4 };
    myObject.SetIntArray(intArray);

   //Awful temporary array filling logic (which doent work properly, but works for the purpose of testing this problem)
    if (myObjectArray[0] == nullptr)
        {
        myObjectArray[0] = &myObject;
    }
    else
    {
        if (myObjectArray[1] == nullptr)
        {
            myObjectArray[1] = &myObject;
        }
          /*    ….until the array is filled */      }
}

还有问题:

当我从VB调试器的mainclass.cpp中的main方法检查这一行代码时,一切看起来都很完美。令牌数组包含我期望的内容:

mainClass->add(tokenArray[i][0], tokenArray[i][1], tokenArray[i][2], tokenArray[i][3], stoi(tokenArray[i][4]), stoi(tokenArray[i][5]), stoi(tokenArray[i][6]), stoi(tokenArray[i][7]), stuff);

我不断浏览代码,直到add方法的结尾。我看到当我到达add方法的末尾时,一切看起来都很好。字符串和整数似乎都已完美设置。在调试器运行完以下代码后,我检查了以下代码行,发现一切看起来都不错。每个数组字段中都有我期望的数据。 (逻辑很烂,每个数组索引的数据都是相同的,但这是为了以后的故障排除会话:D)

myObjectArray[0] = &myObject;

add方法运行后,将执行推迟回main方法,以下代码将结果输出到屏幕:

cout << "TEST" << endl;
cout << mainClass->myObjectArray[0] << endl;

这是问题所在。...mainClass-> myObjectArray [0]在所有字符串属性中都为空值,并且没有任何输出(它们包含““)。...但是int属性具有适当的值输出出于某种原因!

如果任何人对为什么可以使用int以及字符串似乎不存在有任何见解,我将永远感激不已!

再次感谢!

1 个答案:

答案 0 :(得分:0)

鉴于您确实没有发布所有代码,所以您发布的代码显示了一个主要问题,并且可能是程序行为与原来相同的原因。

MainClass::add()函数中,您将局部变量的地址存储在MainClass::myObjectArray数组中,并尝试从add()函数外部访问这些地址。

代码简介:

int main()
{
    MainClass* mainClass = new MainClass();  
    //...
    mainClass->add(...);
    //...
    cout << mainClass->myObjectArray[0] << endl; // <-- index 0 points to a garbage value
 }

 void MainClass::add(string string1, string string2, string string3, string string4, int int1, int int2, int int3, int int4, Stuff stuff)
 {
      MyObject myObject;
      if (stuff == STUFF2) {
        MySubObject1 myObject;  // <-- Local variable
      //...
        int* intArray[] = { &int2, &int3, &int4 }; // <-- Another local variable
        //... 
        myObject.SetIntArray(intArray);  // <-- Storing address of local
        //...
        myObjectArray[0] = &myObject; // <-- Storing address of local
       //...
  }

add()返回时,这些地址将不会指向有效变量,因为这些变量由于是局部变量而不再有效。

因此解决方法是,您必须确保放置在myObjectArray数组中的任何指针,所指向的那些变量的生命周期(作用域)都将持续myObjectArray。 / p>

使用存储“任意”值的类型的数组(例如std::any数组)的更好解决方案。


除此之外,您应该尝试减少对new的不必要的调用。例如,您的main函数从错误的脚开始:

int main()
{
    MainClass* mainClass = new MainClass();  

这本来可以是:

int main()
{
    MainClass mainClass;