使用类对象为类的结构赋值
assigning values to structure of a class using class object
我遇到了一个非常奇怪的问题。这是我的代码:头文件
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
不会为您分配任何内存,active
、suspended
和erased
指向奇怪且未定义的地址。您正在调用未定义的行为。
在不添加所有通常必要的细节的情况下,使用std::string
及其运算符重载。对于简单的解析,请使用流。现在,完全避免使用任何C字符串函数,而只使用C++。
相关文章:
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 如何为结构的数据元素赋值
- 复制引用结构上的赋值
- 如何为结构类型变量赋值
- 在结构的构造函数中使用类方法赋值变量
- 为可变结构赋值,该值必须易于复制
- 在 C++ 中使用 initializer_list 进行结构赋值
- C++复制可克隆层次结构中的构造函数和赋值
- C++ 带有指针、赋值和比较的结构
- Arduino结构变量似乎在没有显式重新赋值的情况下被重新赋值
- 如何使用其他函数返回的值为结构体成员赋值
- C++通用数据结构 - 数据字段赋值运算符与复制 C'Tor
- 为结构灵活数组赋值
- 在C++中添加互斥锁后结构中的赋值运算符
- 在C++中为结构赋值
- 包含字符串值的结构在使用动态内存分配创建后进行赋值时会导致分段错误
- 使用类对象为类的结构赋值
- 从C向Obj-C结构赋值
- 如何在此处为联合内部的结构赋值
- 如何为结构赋值