繁体   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