为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分配内存时,struct中的指针word没有可指向的有效内存。因此,要么malloc也是word的一块内存,要么使word指向另一个字符。

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

  1. 就像您所说的,将其声明为char word[50],而不是"char*"
  2. malloc/calloc(我个人更喜欢calloc,省去了零内存的麻烦,这是一个非常重要的..)外部结构,然后malloc/caloc内部word。在这种情况下,请记住调用free两次

使用word=malloc(128);

这将为可变单词分配128个字节

相关内容

  • 没有找到相关文章

最新更新