簡體   English   中英

使用 malloc 聲明 memory

[英]declaring memory using malloc

gcc (GCC) 4.6.3
c89
apache runtime portable libraries

你好,

只是一個簡單的問題,我想我正在嘗試創建一個 uuid 值。

我想讓我 function 創建它是獨立的(黑盒子)所以我可以只傳遞一個緩沖區,function 將執行 rest。

這意味着我必須在那個 function 的堆上聲明 memory,因為調用 function 不知道要聲明多少。 我知道這是個壞主意,因為 callie 在完成處理后必須釋放 memory。

有什么辦法可以做得更好嗎?

當我運行它時,在 function 返回后,branch_id_buf 始終為 null。 但是,我已經將它傳遞給 function,所以當 function 返回時,它不應該是 null,因為它應該指向一些已分配的 memory。

非常感謝您的任何建議,

static void g_get_branch_id(char *branch_id_buf);

int main(void)
{
    char *branch_id_buf = NULL;

    g_get_branch_id(branch_id_buf);

    printf("branch id [ %s ]\n", branch_id_buf);

    free(branch_id_buf);

    return 0;
}

static void g_get_branch_id(char *branch_id_buf)
{
    apr_uuid_t uuid;

#define MAGIC_COOKIE_LENGTH 9

    const char *MAGIC_COOKIE = "z9hG4bk-";
    const int BRANCH_ID_LENGTH = APR_UUID_FORMATTED_LENGTH + MAGIC_COOKIE_LENGTH;

    branch_id_buf = malloc(BRANCH_ID_LENGTH);
    if(branch_id_buf == NULL) {
        return;
    }

    strncpy(branch_id_buf, MAGIC_COOKIE, BRANCH_ID_LENGTH);
    printf("branch id [ %s ]\n", branch_id_buf);
    apr_uuid_get(&uuid);

#define PREFIX_BRANCH_LENGTH 8
    apr_uuid_format(branch_id_buf + PREFIX_BRANCH_LENGTH, &uuid);

    printf("branch id [ %s ]\n", branch_id_buf);
}

在發布的代碼中, branch_id_buf是 function 的本地:調用者看不到所做的任何更改。

您需要傳遞一個char**

char *branch_id_buf = NULL;

g_get_branch_id(&branch_id_buf);

...

void g_get_branch_id(char **branch_id_buf) {

    /* Dereference 'branch_id_buf' within this function. */
    *branch_id_buf = malloc(BRANCH_ID_LENGTH);

編輯:

正如larsmans評論的那樣,考慮返回一個char*而不是接受一個參數:

char *branch_id_buf = g_get_branch_id();

char* g_get_branch_id() {

    char* branch_id_buf = malloc(BRANCH_ID_LENGTH);
    ...
    return branch_id_buf;
}

這不是一個壞主意。 請小心並記住釋放 memory。有一些常用技術可以使其更加安全; 像引用計數或釋放池。

或者,您可以兩次調用“黑匣子”。 第一次調用時需要多少 memory,然后第二次調用指向已分配緩沖區的指針。

通常,在一個模塊中分配而在另一個模塊中釋放是一個非常糟糕的主意。 這正是您在程序中造成大量 memory 泄漏的原因。 您的代碼特別有問題,因為您不僅將釋放留給調用者,而且還有責任將指針初始化為 NULL

話雖如此,您似乎只處理編譯時常量(?),所以我不明白為什么您甚至需要 malloc。您不能這樣做嗎?

static const char MAGIC_COOKIE[] = "z9hG4bk-";

#define MAGIC_COOKIE_LENGTH (sizeof(MAGIC_COOKIE)/sizeof(char))

#define BRANCH_ID_LENGTH (APR_UUID_FORMATTED_LENGTH + MAGIC_COOKIE_LENGTH)


static void g_get_branch_id (char branch_id_buf [BRANCH_ID_LENGTH]);

原型中的數組長度向調用者指示他們應該將指針傳遞給具有該長度的緩沖區。

暫無
暫無

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

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