通过指针复制typedef结构

时间:2011-11-03 19:09:33

标签: c++ pointers types

我有以下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 ++的理解肯定会更好!

3 个答案:

答案 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

取决于你的代码。但它肯定需要指向有效的记忆!