使用C中的字符指针为结构分配内存

我今天很难修复代码,然后我遇到类似的东西:

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的指针,它在32位系统上只有4个字节,因为它是结构的一部分。 它不包含未知长度的字符串的内存,因此如果您想要一个字符串,您也必须手动为其分配内存。 如果您只是复制字符串,则可以使用strdup()来分配和复制字符串。 你仍然必须自己释放内存。

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

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

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

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

你可以在这里阅读,你需要分别分配char *

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

structptr分配内存时, structptr中的指针word没有有效的内存来指向。 所以你要么为了word对一段记忆进行malloc ,要么让word指向另一个字符。

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

  1. 就像你说的那样,将它声明为char word[50]而不是`char *’
  2. malloc / calloc(我个人更喜欢calloc,省去了zeromemory的麻烦,这是非常重要的..)外部结构,然后malloc / calloc也是内部word 。 在这种情况下,请记得两次free通话。

使用word=malloc(128);

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