簡體   English   中英

結構體內存分配中的 char*

[英]char* in struct memory allocation

所以我有一個這樣的結構(實際上它更大):

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

我用它來保存我的設備的配置; JSON 是一個想法,但它需要大量資源和時間來處理。
我想為每個字符*分配 32 個字符。 這個結構會發生什么:
1.填充未知長度但小於32字節的數據
2.保存到EEPROM
3. 從 EEPROM 讀取到另一個結構體(相同的布局)

我在結構中嘗試了 malloc 和 new ,但沒有用。
分配內存和將數據寫入結構的正確方法是什么?

理想情況下,如果在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;

    }
};

您有兩種為結構成員分配內存的選項:

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()這些動態內存。 我把自由放在了破壞者中,你可以把它們放在你想要的任何地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM