0
gcc (GCC) 4.6.3
c89
apache runtime portable libraries

你好,

只是一个简单的问题,我想我正在尝试创建一个 uuid 值。

我希望我创建它的函数是独立的(黑匣子),所以我可以只传递一个缓冲区,然后该函数将完成其余的工作。

这意味着我必须在该函数的堆上声明内存,因为调用函数并不知道要声明多少。我知道这是个坏主意,因为 callie 必须在完成后释放内存。

有什么办法可以做得更好吗?

当我运行它时,函数返回后,branch_id_buf 始终为空。但是,我已将它传递给函数,因此当函数返回时不应为空,因为它应该指向一些分配的内存。

非常感谢您的任何建议,

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);
}
4

3 回答 3

3

在发布的代码中,branch_id_buf函数是本地的:所做的任何更改对调用者都是不可见的。

你需要通过一个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所评论的,考虑返回 achar*而不是接受参数:

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;
}
于 2012-04-04T09:24:31.040 回答
2

这不是一个坏主意。请小心并记住释放该内存。很少有常用技术可以使其更加安全。比如引用计数或释放池。

或者,您可以两次调用“黑匣子”。第一次调用需要多少内存,然后使用指向已分配缓冲区的指针进行第二次调用。

于 2012-04-04T09:29:24.710 回答
1

通常,在一个模块中分配而在另一个模块中释放是一个非常糟糕的主意。这正是您在程序中创建大量内存泄漏的方式。您的代码特别成问题,因为您不仅将自由留给调用者,而且还有将指针初始化为 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]);

原型中的数组长度向调用者表明他们应该将指针传递给具有该长度的缓冲区。

于 2012-04-04T09:49:23.917 回答