我有以下typedef定义和* ButtonSettingPtr作为指针:
typedef struct
{
void *next;
char** buttonsetting;
char* currentsetting;
uint16_t presetid;
uint16_t currentcounter;
uint16_t maxsize;
uint16_t buttonid;
} ButtonSetting;
typedef ButtonSetting *ButtonSettingPtr;
class Options {
private:
ButtonSettingPtr settings;
ButtonSettingPtr preset1;
public:
Options();
void newSetting(char** _setting, uint16_t _maxsize, uint16_t _buttonid);
// some other stuff defined here
}
使用newSetting()函数,我将向我添加几个新条目 typedef实例!现在,我想保存所有这些设置 (this-> settings)通过memcpy到另一个指针(this-> preset1) 之后通过另一个功能再次调用它们,因为我正在使用它 this->设置在其他几个函数(getCurrentSetting)中 工作得很好等。
char *Options::getCurrentSetting(uint16_t _buttonid) {
ButtonSettingPtr setting = (ButtonSettingPtr)this->settings;
while (setting != NULL)
{
if (setting->buttonid == _buttonid) {
char * tmpsetting =
setting->buttonsetting[setting->currentcounter];
return tmpsetting;
}
setting = (ButtonSettingPtr)setting->next;
}
return NULL;
}
问题在于:
void Options::savePreset() {
memcpy(&this->preset1,&this->settings,sizeof(&this->settings));
}
void Options::loadPreset() {
memcpy(&this->settings,&this->preset1,sizeof(&this->preset1));
}
我的preset1指针似乎总是完全相同 这个 - >设置,即使我在中间更改设置。一世 明白,使用& amp标志,它实际上复制了地址 那个指针,所以毫不奇怪他们都会完全是 相同。但我想复制的是所有字节并指出它们 到preset1,所以我可以在以后重新调用所有设置。
因此,如果没有& amp符号,我的代码就会挂起:
void Options::savePreset() {
memcpy(this->preset1,this->settings,sizeof(this->settings));
}
void Options::loadPreset() {
memcpy(this->settings,this->preset1,sizeof(this->preset1));
}
在记忆所有内容之前,我是否必须使用this-> preset1指针 对吗?整个代码使用avr-libc编译为atmega芯片。
提前感谢任何有用的提示!
ps:当我年轻的时候,我对C ++的理解肯定会更好!
答案 0 :(得分:0)
看起来你正在做一个本土的单链表。如果您将其替换为std::vector
,则会发现将其中一个复制到另一个就像preset1 = settings;
一样简单(除非您更喜欢,否则不需要将this->
放在所有内容之前那种风格)。
您可能还想用char**
替换类中的std::vector<string>
,然后复制实际的字符串。
答案 1 :(得分:0)
是的,你确实需要malloc preset1(不需要在成员函数中使用this-&gt;取消引用它。如果你想清楚它是一个类数据成员,你可以根据需要命名为m_preset1或mPreset1)
因此,在构造函数中将preset1设置为NULL。然后在您的成员函数中,您可以:
void Options::savePreset() {
if (preset1 == NULL) {
preset1 = (ButtonSettingPtr)malloc(sizeof (ButtonSetting));
}
memcpy(preset1, settings, sizeof(ButtonSetting));
}
不要忘记添加错误检查。但实际上,我认为没有任何理由不静态地分配空间并避免内存分配问题:
class Options {
private:
ButtonSetting settings;
ButtonSetting preset1;
public:
Options();
void newSetting(char** _setting, uint16_t _maxsize, uint16_t _buttonid);
// some other stuff defined here
}
void Options::savePreset() {
memcpy(&preset1, &settings, sizeof(ButtonSetting));
}
请注意,sizeof(this-&gt;设置)将始终为4或8(取决于32位或64位CPU),因为您要求指针的大小,而不是结构的大小。
答案 2 :(得分:0)
sizeof(&this->settings)
将返回指针的大小,因为它实际上是一个指针。
sizeof(this->settings)
将返回指针的大小,因为它是一个指针。
sizeof(*this->settings)
将返回设置指向的匿名结构的大小。
至于需要malloc
空间
this->preset1
取决于你的代码。但它肯定需要指向有效的记忆!