gcc (GCC) 4.6.3
c89
apache runtime portable libraries
您好,
只是一个简单的问题,我想我正在尝试创建一个uuid值。
我想要一个让它独立的功能(黑盒子)所以我可以通过一个缓冲区来完成剩下的工作。
这意味着我必须在该函数的堆上声明内存,因为调用函数声明不多。我知道这是一个坏主意,因为在完成它之后,系列必须释放内存。
有什么方法可以做得更好吗?
当我运行它时,在函数返回后,branch_id_buf始终为null。但是,我已将它传递给函数,因此当函数返回时不应为null,因为它应该指向一些已分配的内存。
非常感谢任何建议,
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);
}
答案 0 :(得分: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所述,请考虑返回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;
}
答案 1 :(得分:2)
这不是一个坏主意。要小心,记得释放那段记忆。几乎没有什么常用技术可以使它更安全;比如参考计数或发布池。
或者你可以两次打电话给你的“黑匣子”。首先调用你需要多少内存然后用指针调用已分配的缓冲区。
答案 2 :(得分: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]);
原型中的数组长度向调用者表明他们应该将指针传递给具有该长度的缓冲区。