【问题标题】:Allocate memory for a struct with a character pointer in C在 C 中为具有字符指针的结构分配内存
【发布时间】:2013-08-17 08:50:48
【问题描述】:

我今天正在努力修复代码,然后我遇到了类似的情况:

typedef struct {
int a; 
int b; 
int c;
int d;
char* word;
} mystruct;

int main(int argc, char **argv){

    mystruct* structptr = malloc(sizeof(mystruct));
    if (structptr==NULL) {
        printf("ERROR!")
        ...
    }
    ...
    free(structptr);

    return 0;
}

由于char* word 是一个可变长度的字符串,并且 malloc 没有为它分配足够的内存,因此代码给出了很多内存错误。事实上,它只是为整个struct 分配20 Bytes。有没有办法解决这个问题,而不是将char* 变成char word[50] 之类的东西?

【问题讨论】:

  • 看到您有评论,但随后将其删除。请使用更多信息编辑您的问题或提交第二个问题。有一些方法可以处理长度变化的char 向量。
  • 我添加了评论,然后在下面的 cmets 中找到了答案。我相信,固定的缓冲区大小实际上是最好的解决方案,因为单词将代表一个名字,而名字不应该和小说一样长;)。谢谢您的帮助。我真的很好奇为变量字符串分配内存,这就是我问的原因。但无论如何我都会切换到固定长度的数组。
  • 现在空间(即 RAM)很充足,因此在大多数情况下,定义一个 1024 大的字符数组不会造成问题。 I/O 缓冲区通常比这大得多。
  • @hhachem 您显然不太了解指针。请阅读指针和数组(例如,here

标签: c pointers memory struct malloc


【解决方案1】:

您只为结构本身分配内存。这包括指向 char 的指针,它在 32 位系统上只有 4 个字节,因为它是结构的一部分。它不包括未知长度字符串的内存,所以如果你想要一个字符串,你也必须手动为其分配内存。如果你只是复制一个字符串,你可以使用 strdup() 分配和复制字符串。不过,您仍然必须自己释放内存。

 mystruct* structptr = malloc(sizeof(mystruct));
 structptr->word = malloc(mystringlength+1);

 ....

 free(structptr->word);
 free(structptr);

如果你不想自己为字符串分配内存,你唯一的选择就是在你的结构体中声明一个固定长度的数组。然后它将成为结构的一部分,sizeof(mystruct) 将包含它。这是否适用,取决于您的设计。

【讨论】:

  • @H2CO3,我不认为 Devolus 欣赏你的观点。
  • @JackCColeman,特别是因为在没有任何信息的情况下批评是不是很有建设性。
  • @Devolus,我认为他实际上是在与 hhachem 交谈,或者像我一样讽刺!
  • @JackCColeman,哦!我以为他是在给我说话,因为这是对我帖子的评论。 :o
  • 反之亦然。如果长度未知,则必须动态分配内存,除非您可以对字符串长度设置上限。当然,您还应该添加代码,以确保在这种情况下不超过固定长度(并且不要忘记在处理字符串时考虑0 byte)。所以如果你说没有字符串可以长于 50+1,那么数组更容易维护。
【解决方案2】:

添加第二个mallocword 所需的任何长度(N)

   mystruct* structptr = malloc(sizeof(mystruct));

   structptr->word = malloc(sizeof(char) * N);

【讨论】:

    【解决方案3】:

    您可以阅读here,您需要单独分配char *

    mystruct* structptr = malloc(sizeof(mystruct));
    structptr->word = malloc(sizeof(WhatSizeYouWant));
    

    【讨论】:

      【解决方案4】:

      当你为structptr分配内存时,struct中的指针word没有有效的内存指向。所以你要么malloc 也为word 分配一段内存,要么让word 指向另一个字符。

      【讨论】:

        【解决方案5】:

        malloc 外部结构将仅分配 *word 指向的 1 字节内存,因为它是 'char *' 类型。如果要分配word 指向的超过1 字节的内存,有两种选择:

        1. 如你所说,将其声明为char word[50] 而不是`char *'
        2. malloc/calloc(我个人更喜欢calloc,省去了zeromemory的麻烦,这很重要..)外部结构,然后malloc/calloc内部word也是如此。在这种情况下,请记住两次调用free

        【讨论】:

          【解决方案6】:

          使用word=malloc(128);

          这将为您的变量字分配 128 个字节,

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-09-23
            • 1970-01-01
            • 2019-10-20
            • 2014-02-23
            • 1970-01-01
            • 2015-08-05
            • 1970-01-01
            • 2023-04-02
            相关资源
            最近更新 更多