为C中带有字符指针的结构分配内存

为C中带有字符指针的结构分配内存,c,pointers,memory,struct,malloc,C,Pointers,Memory,Struct,Malloc,我今天正在努力修复一个代码,然后我遇到了类似的情况: 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!") ...

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

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没有为其分配足够的内存,因此代码给出了大量内存错误。事实上,它只为整个结构分配了20个字节。有没有办法解决这个问题,而不将
char*
转换成类似
char-word[50]

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

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

 ....

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

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

word

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

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


这将为可变字分配128个字节,

当为
structptr
分配内存时,
struct
中的指针
word
没有指向的有效内存。因此,您也可以使用
malloc
word
分配一段内存,或者将
word
指向另一个字符。

正如您所理解的,您需要分别分配
字符*

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

malloc外部结构将只分配由
*word
指向的1字节内存,因为它是“char*”类型。如果要分配由
word
指向的超过1字节的内存,有2个选项:

  • 就像你说的,把它声明为
    char-word[50]
    而不是'char*'
  • malloc/calloc(我个人更喜欢calloc,省去了zeromemory的麻烦,这是一个非常重要的..)外部结构,然后malloc/calloc也是内部的
    单词。在这种情况下,记得同时拨打两次免费电话

  • @H2CO3,我不认为Devulus欣赏你的观点。@JackCColeman,特别是因为critzize没有提供任何信息是错误的,这不是很有建设性的。@Devulus,要说H2CO3的功劳,我想他实际上是在和hhachem说话,或者像我一样挖苦人@杰克曼,噢!我以为他是在给我写信,因为这是对我帖子的评论反之亦然。如果长度未知,则必须动态分配内存,除非可以对stringlength设置上限。当然,您也应该添加代码,以确保在这种情况下不超过固定长度(并且在处理字符串时不要忘记考虑<代码> 0)/代码>字节。因此,如果您说字符串不能超过50+1,那么数组更容易维护。您看到了注释,但随后将其删除。请使用更多信息编辑您的问题或提交第二个问题。有一些方法可以处理长度变化的
    char
    向量。我添加了注释,然后在下面的注释中找到了答案。我相信,固定的缓冲区大小实际上是最好的解决方案,因为word将代表一个名称,而名称不应该像小说那么长;)。谢谢你的帮助。我只是很好奇为变量字符串分配内存,这就是为什么我问这个问题。但我还是打算改用固定长度的数组。现在空间(即RAM)很充足,所以在大多数情况下,定义1024个字符的数组不会产生问题。I/O缓冲区通常比这个大得多。@hhachem您显然不太理解指针。请阅读有关指针和数组(例如)可能重复的