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

assigning values to structure of a class using class object

本文关键字:结构 赋值 对象      更新时间:2023-10-16

我遇到了一个非常奇怪的问题。这是我的代码:头文件

namespace test
{
class LoadConfigData
{
    struct control_params
    {
         char               active[];
         char               suspended[];
         char               erased[];        
    }*ctrl_params;
bool loadConfig();
};
};

主要.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;
}

输出:

ER
ER
ER

这意味着它将为每个结构成员打印最后一个复制的字符串。我的代码出了什么问题。

问题是没有给字符数组一个大小:

struct control_params
{
     char               active[];
     char               suspended[];
     char               erased[];        
}*ctrl_params;

我很惊讶这个汇编;我的理解是,无大小数组是一个不完整的类型,因此不可能是非静态类成员。然而,我的编译器至少(可能还有你的编译器)将这些数组视为大小为零的数组,都位于内存中的同一位置。因此,每次你给一个人写信,它都会覆盖你给其他人写的任何内容。(当然,行为是未定义的,因为它在数组边界之外写入)。

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

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

在不添加所有通常必要的细节的情况下,使用std::string及其运算符重载。对于简单的解析,请使用流。现在,完全避免使用任何C字符串函数,而只使用C++。