首页 > 解决方案 > 指针数组输出整数变量没有问题,但字符串都是空的

问题描述

我是 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 属性对于某些具有正确的输出原因!

如果有人能深入了解为什么整数可用而字符串似乎不可用,我将永远感激不尽!

再次感谢!

标签: c++arrayspointers

解决方案


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

在您的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.

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


除此之外,您应该尝试减少对new. 例如,您的main函数一开始就走错了路:

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

这可能只是:

int main()
{
    MainClass mainClass;

推荐阅读