c++ - vector 元素输出垃圾

标签 c++ vector output garbage

我的类中有一个函数返回一个 vector ,其中包含从 ini 文件中读取的 User 和 Pass。

这是读取它的代码。我在此处添加了用于测试的输出,它正在成功读取它。

vector<char*> Main::GetAccount(int i)
{
    vector<char*> LoginInfo;

    char szUser[13];
    char szPass[13];
    char szBuf[3];

    _itoa_s(i, szBuf, 10);

    GetPrivateProfileString(szBuf, "UserID", "User", szUser, 13, ".\\accounts.ini");
    GetPrivateProfileString(szBuf, "Pass", "Pass", szPass, 13, ".\\accounts.ini");

    if (strcmp(szUser, "User") == 0)
    {
        char szBuffer[80];
        sprintf_s(szBuffer, "Cannot read account %i.", i);
        Log(szBuffer);
        exit(EXIT_FAILURE);
    }
    else
    {
        LoginInfo.push_back(szUser);
        LoginInfo.push_back(szPass);

        return LoginInfo;
    }
}

这是我调用它的地方,也是它出错的地方。

for (int i = 1; i < main->nBots + 1; i++)
{
    vector<char*> LoginInfo = main->GetAccount(i);

    char* szUser = LoginInfo[0];
    char* szPass = LoginInfo[1];

    cout << szUser << endl << szPass << endl;
}

最佳答案

您正在将指针推回到 szUserszPass进入你的 Vector 然后返回它。这很糟糕,因为 szUserszPass是局部变量,一旦您从函数返回就会被销毁。

现在

vector<char*> LoginInfo = main->GetAccount(i);

char* szUser = LoginInfo[0];
char* szPass = LoginInfo[1];

在这里您可以访问这些当前指向一些垃圾的指针。这是未定义的行为。你应该重新考虑你想做什么,可能想使用 std::string而不是处理 char *的。

将其设为 vector<std::string>您将获得内部字符串的正确拷贝,而不必担心难看的 char *指向超出范围的某个位置。

关于c++ - vector 元素输出垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24092559/

相关文章:

c++ - OpenGL 多渲染目标和多重采样

c++ - B类中的A类初始化包含指向A类的指针

java - java中可以生长的二维对象

python - 使用 if False 并在不停止 Loop 的情况下打印

java - 如何在字节数组 Java 中表示 header 值和实际消息?

c++ - 为什么在通过 const 引用传递临时值时调用复制构造函数?

c++ - (struct in_addr **) 和 *(struct in_addr *) 之间的区别

c++ - 在函数中编码两个 vector

c - 如何使我的输出仅显示我的 c 支票生成器程序所需的内容

c++ - 从文件输入和输出