不能将char转换为char*[]和非法的操作数大小
Cannot convert char to char*[] and illegal sizeof operand
我正试图从文件中读取并将每个新行/项放入数组中。然而,我更熟悉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]分配存储,因此您的程序正在写入未初始化的内存。也许一个繁荣正在等待发生。我要提出一个完全不同的建议。
:
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
是多余的。