我今天很难修复一个代码,然后我遇到了类似的东西:
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字节的内存,有两个选项:
- 就像您所说的,将其声明为
char word[50]
,而不是"char*" - malloc/calloc(我个人更喜欢calloc,省去了零内存的麻烦,这是一个非常重要的..)外部结构,然后malloc/caloc内部
word
。在这种情况下,请记住调用free
两次
使用word=malloc(128);
这将为可变单词分配128个字节