【问题标题】:char* in struct memory allocationchar* 在结构内存分配中
【发布时间】:2018-02-11 15:15:44
【问题描述】:

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

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

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

我在结构中尝试了 malloc 和 new ,但没有成功。
分配内存并将数据写入结构的正确方法是什么?

【问题讨论】:

  • 为什么不char varName[32]
  • 因为当我在另一台机器上读取 struct 时,我不想再次将 char[] 转换为 char*
  • @FotelPL 您不必将数组转换为指针,因为两者都可以互相代替使用(因为 char 数组/指针的定义类似并且由于衰减)。
  • 我在 struct 中尝试了 malloc 和 new,但没有成功。 究竟是什么没有成功?
  • @MichaelWalz char* selfName = (char*)malloc(32*sizeof(char)) 与“新”相同。

标签: c++ pointers memory struct char


【解决方案1】:

如果在c++ 中,最好使用std::string 而不是char*

对于您的代码,这可能与析构函数一起更具可读性:

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;

    }
};

【讨论】:

    【解决方案2】:

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

    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 运算符一起使用。但您应该记住,在使用这些动态记忆后,您必须free()。我把免费的放在 disstructor 里,你可以把它们放在你想要的任何地方。

    【讨论】:

    • 为什么不用~_setup() 来释放他们?
    • @patatahooligan 你是完全正确的。在析构函数中释放是个好主意
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2021-07-17
    • 2015-08-05
    • 2014-12-17
    • 2010-11-20
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多