结构内存分配中的char *

时间:2018-02-11 15:15:45

标签: c++ pointers memory struct char

所以我有一个这样的结构(事实上它更大):

struct _setup {
    char* selfName;
    int8_t zone;
    char* selfSSID;
    char* selfWPA2;
}

我用它来保存我的设备的配置; JSON是一个想法,但它需要很多资源和时间来处理 我想为每个char *分配32个字符。 这个结构会发生什么:
1.填充未知长度BUT短于32字节的数据
2.保存到EEPROM
3.从EEPROM读取到另一个结构(相同的布局)

我在结构中尝试了malloc和new但它没有用。
分配内存和向struct写入数据的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

如果在std::string

,理想情况下应使用char*而非c++

对于您的代码,这可能是更易读的方式与析构函数:

struct _setup {
    char* selfName;
    int8_t zone;
    char* selfSSID;
    char* selfWPA2;
    _setup()
    {
         selfName = new char[32];
         selfSSID = new char[32];
         selfWPA2 = new char[32]; //Or this for direct value: new char [strlen("hello") + 1];
        //strcpy(selfWPA2, "hello");
    }

    ~_setup()
    {
        delete selfName;
        delete selfSSID;
        delete selfWPA2;

    }
};

答案 1 :(得分:0)

您有两种为结构成员分配内存的选项:

1-静态内存分配:

struct _setup {
    char selfName[32];
    int8_t zone;
    char selfSSID[32];
    char selfWPA2[32];
}

如果您的分配大小很短并且您在编译时知道该大小,则建议使用静态分配。否则使用动态分配。

静态分配比动态分配更快。但是如果你想从这个结构创建大量的对象,你可能会得到Stackoverflow异常。因为你可以利用所有的堆栈空间。 (如果您的实际数组大小约为32,则Stackoverflow异常是不可能的)

2-动态分配:

struct _setup {
    char* selfName;
    int8_t zone;
    char* selfSSID;
    char* selfWPA2;
    _setup()
    {
         selfName= (char*)malloc(sizeof(char)*32);
         selfSSID= (char*)malloc(sizeof(char)*32);
         selfWPA2= (char*)malloc(sizeof(char)*32);
    }
    ~_setup()
    {
         free(selfName);
         free(selfSSID);
         free(selfWPA2);
    }
}

您可以使用malloc或new运算符进行动态分配。但你应该记住,使用它们后你必须自由()这些动态记忆。我把它放在了析构函数中,你可以把它放在你想要的任何地方。