Как мне правильно mallo c этой структуры? - PullRequest
0 голосов
/ 01 апреля 2020

Я не знаю правильный порядок использования mallo c в моем случае.

Структуры:

typedef struct buffer_char
{
    size_t size;
    char *p;
} buffer_char;

typedef struct buffer_buffer_char
{
    size_t size;
    buffer_char *p;
} buffer_buffer_char;

typedef struct LPWA_COMMAND
{
    LPWA_COMMAND_TYPE type;
    buffer_char text;
    buffer_buffer_char writeargs;
    buffer_buffer_char readargs;

} LPWA_COMMAND;

typedef struct buffer_LPWA_COMMAND
{
    size_t size;
    LPWA_COMMAND *p;

} buffer_LPWA_COMMAND;

А теперь я хочу mallo c в init ( * buffer_LPWA_COMMAND):

buffer_LPWA_COMMAND test;
init(&test);

Мне достаточно знать, как выполнить mallo c buffer_buffer_char, но я хотел поделиться всем кодом.

Было бы это правильно ?:

void buffer_char_init(buffer_char *buf)
{
    buf->p = (char*)malloc(sizeof(char));
    buf->size = 0;
}

void buffer_buffer_char_init(buffer_buffer_char *buf)
{
    buf->p = (buffer_char*)malloc(sizeof(buffer_char));
    buffer_char_init(&buf->p[0]);
    buf->size = 0;
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

, так как вы упомянули, что вы просто отправляете одну функцию типа buffer_buffer_char в функцию void buffer_buffer_char_init(buffer_buffer_char *buf), используя &buf->p[0] не имеет смысла, когда вы выделяете здесь только одну buffer_char (не массив) здесь buf->p = (buffer_char*)malloc(sizeof(buffer_char));.

также в void buffer_char_init вы выделяете память только для одного символа, а не для строки.

void buffer_char_init(buffer_char * buf)
{
    buf->p = (char*)malloc(sizeof(char)*(sting length);
    buf->size = 0;
}

void buffer_buffer_char_init(buffer_buffer_char * buf)
{
    buf->p = (buffer_char*)malloc(sizeof(buffer_char));
    buffer_char_init(buf->p);
    buf->size = 0;
} 
0 голосов
/ 01 апреля 2020

Как указано выше, &buf->p[0] - это не то же самое, что buffer_char *buf. &buf->p[0] является адресом значения buf->p[0]. Это ссылка. buffer_char *buf является указателем.

Приведенный ниже код может помочь вам иметь идею для инициализации ваших структур:

void init_buffer_char(buffer_char * buf_c, int length) {
    // Allocate the pointer "buf_c"
    buf_c = malloc(sizeof(buffer_char));
    // Allocate the pointer that points to character
    buf_c->p = malloc(sizeof(char) * length);
    buf_c->size = 0;
}

void init_buffer_buffer_char (buffer_buffer_char * buf_buf_c) {
    buf_buf_c = malloc(sizeof(buffer_buffer_char));
    init_buffer_char(buf_buf_c->p);
    buf_buf_c->size = 0;
}

См. Разницу между указателем и ссылкой здесь

...