C++ 使用类对象为类的结构赋值

C++ 使用类对象为类的结构赋值,c++,class,object,struct,C++,Class,Object,Struct,我有一个非常奇怪的问题。 这是我的密码: 头文件 namespace test { class LoadConfigData { struct control_params { char active[]; char suspended[]; char erased[]; }*ctrl_params; bool loa

我有一个非常奇怪的问题。 这是我的密码: 头文件

namespace test
{
class LoadConfigData
{

    struct control_params
    {
         char               active[];
         char               suspended[];
         char               erased[];        
    }*ctrl_params;
bool loadConfig();
};
};
Main.cpp

using namespace std;
using namespace test;
namespace test
{
extern LoadConfigData           *loadConfigDataobj;
LoadConfigData *loadConfigDataobj   = new LoadConfigData;
};
int main()
{
loadConfigDataobj->loadConfig();
cout <<loadConfigDataobj->ctrl_params->active_status_code_v<<endl;
cout <<loadConfigDataobj->ctrl_params->suspended_status_code_v<<endl;
cout <<loadConfigDataobj->ctrl_params->erase_status_code_v<<endl;
return 0;
}

bool LoadConfigData::loadConfig()
{
std::string a = "AC";
std::string b = "SP";
std::string c = "ER";
LoadConfigData::ctrl_params = new LoadConfigData::control_params;
sprintf(loadConfigDataobj->ctrl_params->active,"%s",a.c_str());
sprintf(loadConfigDataobj->ctrl_params->suspended,"%s",b.c_str());
sprintf(loadConfigDataobj->ctrl_params->erased,"%s",c.c_str());
return true;
}
这意味着它正在为每个结构成员打印最后复制的字符串。
我的代码有什么问题。

问题在于您对sprintf的使用。sprintf不会为您分配任何内存,active、suspended和Erasted都指向奇怪的未定义的地址。您正在调用未定义的行为


在不添加所有通常需要的细节的情况下,使用std::string及其运算符重载。对于简单的解析,请使用流。现在,完全避免任何C - Stand函数,而只使用C++。< /P> < P>问题是,你不给字符数组一个大小:

struct control_params
{
     char               active[];
     char               suspended[];
     char               erased[];        
}*ctrl_params;
我相当惊讶,这是汇编;我的理解是,无大小的数组是不完整的类型,因此不能是非静态类成员。然而,我的编译器(至少应该是您的编译器)将这些数组视为大小为零的数组,它们都位于内存中的同一位置。因此,每次你给一个人写东西时,它都会覆盖你给其他人写的东西。当然,该行为是未定义的,因为它在数组边界之外写入


最简单的解决方案是使用std::string来表示字符串。这将自动管理其大小,您可以简单地编写active=a,而不是与sprintf或strncpy混在一起,希望不会出现缓冲区溢出。

是的。没错。这是非大小数组的问题。定义大小解决了我的问题。谢谢:@sajal:你知道你在做什么吗?你确定绳子总是足够大吗?为什么不直接使用std::string呢?如果这些都是真正的配置数据,那么您通常无法控制输入长度,那么您将遇到任何破解程序都欢迎的安全问题。您对字符串函数漏洞了解多少?请深入阅读,特别是但不完全是关于缓冲区溢出和格式字符串攻击。我真的希望这不是生产代码,只是为了学习。@phresnel:非常感谢您的关注。我在这里提到的代码与我正在使用的代码不同。我从数据库中获取数据,我必须使用一个特定的库,该库以字符数组的形式返回数据,然后将其存储在控制参数中。我知道字符串的大小,因此它现在可以工作了。但是是的,如果以后字符串大小发生变化,除了更改代码外,我没有其他选择。@sajal:您的DB API可以更改,它也会更改。那时,您将忘记您的字符数组。如果程序出现故障,您将很幸运。但它可能会持续数月,只有在你的最高盛宴上,它才会突然发生故障,并让你付出金钱和名誉的代价。最好从一开始就使用字符串。
struct control_params
{
     char               active[];
     char               suspended[];
     char               erased[];        
}*ctrl_params;