malloc转换内存为struct

时间:2011-08-18 03:36:08

标签: c malloc

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结构函数。

3 个答案:

答案 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指针的工作原理非常重要。