无法将char转换为char * []和非法sizeof操作数

时间:2015-08-21 00:55:21

标签: c++ arrays char

我正在尝试从文件中读取并将每个新行/条目放入数组中。但是,我更主要熟悉C#而C ++不是我的事。我需要这样做的原因是一个项目,我是唯一愿意做这个部分的人。

我不知道如何正确转换字符类型或者是否可能。我试过在互联网上搜索,但没有找到任何关于我的问题的答案。另外,因为我不知道是什么导致了非法的操作数,我不知道这里有什么问题。

#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;
}

2 个答案:

答案 0 :(得分:3)

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

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

除非进行基本的重写,否则这段代码注定要失败。我强烈建议您将char*替换为std::string,并将固定大小的数组切换为向量。

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); 
        }
    }
}

有条件的评论:

我无法确定,因为我不知道Addresses成员的定义,但以下陈述相对可疑:

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

它表明Addresses::BotArray1是一个数组或一个指针。但是您使用(char***)进行投射的事实表明您尝试修复类型不匹配。只有当BotArray指向已存储char**地址的有效NameList指针时,取消引用已转换指针才有意义。

答案 1 :(得分:2)

在C ++中,数组必须在创建时调整大小,然后才能修复,因此char* Bots::NameList[] = {};是一个零元素数组,并且就是这样。更糟糕的是,在file >> Bots::NameList[i]没有为Bots :: NameList [i]分配存储空间,所以你的程序正在写入未初始化的内存。可能是BOOM等待发生。我将提出一些完全不同的建议。

Bots类定义中的

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变得多余,因为矢量知道它们的大小。