malloc内存的正确方法是什么?它们之间有什么区别?
void parse_cookies(const char *cookie, cookie_bank **my_cookie, int *cookies_num)
{
*my_cookie = malloc(sizeof(cookie_bank) * 1);
*my_cookie = (cookie_bank *)malloc(sizeof(cookie_bank) * 1);
my_cookie = (cookie_bank **)malloc(sizeof(cookie_bank) * 1);
///
}
我正在尝试使用malloc数组的cookie_bank结构函数。
答案 0 :(得分:4)
我假设您希望函数为数组分配内存并通过指针参数传递结果。所以,你想写T * x = malloc(...)
,并将结果分配给指针参数*y = x
:
cookie_bank * myarray;
parse_cookies(..., &myarray, ...);
/* now have myarray[0], myarray[1], ... */
所以正确的调用应该都是一行,
parse_cookies(..., cookie_bank ** y, ...)
{
*y = malloc(sizeof(cookie_bank) * NUMBER_OF_ELEMENTS);
}
答案 1 :(得分:2)
你的第二个例子是最正确的。你显然不需要* 1.
*my_cookie = (cookie_bank *)malloc(sizeof(cookie_bank) * 1);
你的第一个例子也是正确的,虽然一些编译器/标志会引起关于来自void *的隐式演员的抱怨:
*my_cookie = malloc(sizeof(cookie_bank) * 1);
你想分配多个你通常使用calloc()的条目,因为它也会将内存归零:
*my_cookie = (cookie_bank*)calloc(sizeof(cookie_bank), 1);
你的第三个例子是错的:
my_cookie = (cookie_bank **)malloc(sizeof(cookie_bank) * 1);
这将覆盖本地my_cookie指针,并且在函数返回时内存将丢失。
答案 2 :(得分:1)
我只是建议你阅读一些C教科书。在我看来,你对C语言指针的工作原理并不清楚。
无论如何,这里有一些用malloc分配内存的例子。
#include <stdlib.h>
void parse_cookies(const char *cookie, cookie_bank **my_cookie, int *cookies_num)
{
if (cookies_num == NULL || *cookies_num == 0) {
return;
}
if (my_cookie == NULL) {
my_cookie = (cookie_bank**)malloc(sizeof(cookie_bank*) * *cookies_num);
}
for (int i = 0; i < *cookies_num; i++) {
*my_cookie = (cookie_bank*)malloc(sizeof(cookie_bank));
my_cookie++;
}
}
当然,此示例不包含任何错误处理。基本上,my_cookie是指向指针的指针,这意味着my_cookie只是指向点存储器位置的指针,它指向指针数组。第一个malloc使用指针大小和请求的cookie结构数来分配内存。然后第二个malloc实际上为每个结构分配内存。
此功能的问题在于,除非非常小心地使用它,否则很容易导致内存泄漏。
无论如何,了解C指针的工作原理非常重要。