不能将char转换为char*[]和非法的操作数大小

Cannot convert char to char*[] and illegal sizeof operand

本文关键字:char 非法 操作数 转换 不能      更新时间:2023-10-16

我正试图从文件中读取并将每个新行/项放入数组中。然而,我更熟悉c#, c++不是我的菜。我需要这样做的原因是一个项目,我是唯一一个愿意做这部分。

我不知道如何正确转换字符类型或如果它是可能的。我试着在互联网上搜索,但没有找到任何关于我的问题的答案。同样,因为我不知道是什么原因导致了非法的sizeof操作数,所以我也不知道这里出了什么问题。

#include "..STDInclude.h"
// TODO: Fill that list with names
char* Bots::NameList[] = {};
void Bots::GetNames()
{
    using namespace std;
    ifstream file("bot_names.txt");
    if (file.is_open())
    {
        for (int i = 0; i < 48; i++)
        {
            file >> Bots::NameList[i];
        }
    }
}
void Bots::Initialize()
{
    // Replace staff array with custom one
    *(char***)Addresses::BotArray1 = Bots::NameList;
    *(char***)Addresses::BotArray2 = Bots::NameList;
    *(char***)Addresses::BotArray3 = Bots::NameList;
    // Apply new array size
    int size = (sizeof(Bots::NameList) / sizeof(Bots::NameList[0]));
    *(BYTE*)Addresses::BotArraySize1 = size;
    *(BYTE*)Addresses::BotArraySize2 = size;
    *(BYTE*)Addresses::BotArraySize3 = size;
    *(BYTE*)Addresses::BotArraySize4 = size;
}

c++中的数组是固定大小的。所以当你写char* Bots::NameList[] = {}时,你有一个空的c字符串数组(也就是char*)。

更糟糕的是,当您稍后写入file >> Bots::NameList[i];时,您将空终止的c字符串写入未初始化的指针,这将导致内存损坏。

除非从根本上重写,否则这段代码注定要失败。我强烈建议您用std::string替换char*的使用,并从固定大小的数组切换到向量。

std::vector<std::string> Bots::NameList;
void Bots::GetNames()
{
    ...
        for (int i = 0; i < 48; i++)
        {
            string s;   // space separated strings ? sure ? 
            file >> s;  //     or getline(file, s) if you want lines
            NameList.push_back(s); 
        }
    }
}

Aditional备注:

我不能确定,因为我不知道Addresses成员的定义,但是像下面这样的语句相对来说是可疑的:

*(char***)Addresses::BotArray1 = Bots::NameList;

表明Addresses::BotArray1是一个数组或指针。但是,您使用(char***)进行强制转换的事实表明,您试图修复类型不匹配。只有当BotArray已经指向一个有效的char**指针(NameList的地址应该存储在该指针中)时,对强制转换的指针进行解引用才有意义。

在c++中,数组必须在创建时确定大小,然后它是固定的,所以char* Bots::NameList[] = {};是一个零元素数组,并且被卡住了。更糟糕的是,在file >> Bots::NameList[i]中,没有任何东西为Bots::NameList[i]分配存储,因此您的程序正在写入未初始化的内存。也许一个繁荣正在等待发生。我要提出一个完全不同的建议。

bot类定义中的

:

std::vector<std::string> NameList;

之后…

void Bots::GetNames()
{
    std::ifstream file("bot_names.txt");
    if (file.is_open())
    {
        for (int i = 0; i < 48; i++)
        {
            std::string temp;
            file >> temp;
            NameList.push_back(temp);
        }
    }
}

Addresses::BotArray1..N也必须变成std::vector,因为矢量知道它们的大小,所以Addresses::BotArraySize1..N是多余的。