malloc конвертирует память для структуры - PullRequest
0 голосов
/ 18 августа 2011

Как правильно распределить память?И в чем разница между ними?

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 ]

4 голосов
/ 18 августа 2011

Я предполагаю, что вы хотите, чтобы функция выделяла память для массива и передавала результат через параметр указателя. Итак, вы хотите написать 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);
}
2 голосов
/ 18 августа 2011

Ваш второй пример самый правильный.Вам явно не нужен * 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, и память будет потеряна при возврате функции.

1 голос
/ 18 августа 2011

Я просто хотел бы порекомендовать вам прочитать какой-нибудь учебник по Си. Мне кажется, что у вас нет четкого понимания того, как работают указатели на языке Си.

В любом случае, вот несколько примеров выделения памяти с помощью 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...