【问题标题】:How do I correctly malloc this structure?我如何正确地 malloc 这个结构?
【发布时间】:2020-04-01 12:40:12
【问题描述】:

我不知道在我的情况下使用 malloc 的正确顺序。

结构:

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;

现在我想在 init(*buffer_LPWA_COMMAND) 中进行 malloc:

buffer_LPWA_COMMAND test;
init(&test);

我知道如何 malloc 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;
}

谢谢!

【问题讨论】:

  • 不清楚这个结构是如何使用的。只需将所有内容初始化为 0 就足够了,但这实际上取决于其余代码对结构内容所做的假设。
  • @chqrlieforyellowblock 在这种情况下引用每个需要 malloc 的指针,稍后再重新分配。只是简单的附加函数。
  • @PaulOgilvie 它没有给出编译错误。我很确定,&buf->p[0] 与 buffer_char *buf 相同,因为 buf->p[0] 是 buffer_char。这就是这样做的全部原因。它应该代表类似:string[];
  • 您是否将buffer_buffer_char 的数组发送给函数void buffer_buffer_char_init(buffer_buffer_char *buf)
  • @hanie 只是一个 buffer_buffer_char 类型的单一结构,如下所示:buffer_buffer_char foo; buffer_buffer_char_init(&foo);

标签: c malloc


【解决方案1】:

和上面的cmets一样,&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;
}

查看指针和引用here的区别

【讨论】:

  • 除了内存泄漏之外,这些函数似乎没有做任何事情。也许您的意思是函数参数是指向结构指针的指针?
  • 是的。我只是写了一个简单的例子来分配他的结构。每个函数的参数是指向结构的指针。当然,他可以返回一个指针或者使用其他函数来分配内存
【解决方案2】:

既然您提到您只是将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;
} 

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2013-12-20
    • 2013-11-05
    • 2016-02-06
    相关资源
    最近更新 更多