在C语言中为一个包含字符指针的结构体分配内存

10

今天我在努力修复一段代码,然后我碰巧找到了类似于以下内容的东西:

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字节的内存。有没有一种方法可以解决这个问题,而不需要将char*转换成像char word[50]这样的形式?


看到您曾经有过一条评论,但是随后将其删除了。请编辑您的问题并提供更多信息,或者提交第二个问题。有一些方法可以处理长度变化的char向量。 - JackCColeman
我添加了注释,然后在下面的注释中找到了答案。我认为,固定的缓冲区大小实际上是最好的解决方案,因为单词将表示一个名称,而名称不应该像小说一样长;) 。谢谢帮助。我只是非常好奇如何为可变字符串分配内存,这就是我问的原因。但是我无论如何都要切换到固定长度数组。 - H_squared
现在的空间(即RAM)非常充足,因此在大多数情况下,定义一个大小为1024的字符数组不会引起问题。输入/输出缓冲区通常比这大得多。 - JackCColeman
1
@hhachem,你显然不太理解指针。请阅读有关指针和数组的资料(例如,在这里:http://c-faq.com/aryptr/index.html)。 - user529758
可能是为char数组分配内存的重复问题。 - GSerg
6个回答

22

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

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

 ....

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

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


1
@H2CO3,我认为Devolus不欣赏你的观点。 - JackCColeman
1
@JackCColeman,尤其是因为在没有任何信息的情况下批评是毫无建设性的。 - Devolus
@Devolus,要给H2CO3点赞,我认为他实际上是在和hhachem说话,或者像我一样很讽刺! - JackCColeman
@Devolus 糟糕,我本来想在问题下留言,而不是回答下!抱歉,我搞错了。 - user529758
@H2CO3,没问题,我一开始也有点困惑。 :) - Devolus
显示剩余2条评论

3

添加第二个malloc来满足所需的word长度(N)

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

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

3

正如您可以在这里阅读到的那样,您需要单独分配char *

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

1
当你为structptr分配内存时,struct中的指针word没有有效的内存来指向。因此,您可以为word分配一块内存,或将word指向另一个字符。请保留HTML标记。

0

在使用malloc分配外部结构时,由于它是'char *'类型,因此只会分配1字节内存,指向*word。如果您想要分配超过1字节的内存,有两个选项:

  1. 像您所说的那样,将其声明为char word[50]而不是'char *'
  2. 先使用malloc/calloc(我个人更喜欢calloc,可以避免零内存的麻烦,这非常重要...)分配外部结构,然后再分配内部word。在这种情况下,记得调用两次free

-2

使用word=malloc(128);

这将为您的变量word分配128个字节的空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接