[英]Allocate memory for a struct with a character pointer in 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);
当您分配内存structptr
,指针word
的struct
没有有效的记忆点。 让你无论是malloc
一块内存的word
,也还是让word
点到另一个角色。
malloc外部struct只分配*word
指向的1字节内存,因为它是'char *'类型。 如果要分配超过1个字节的内存word
,有2个选项:
char word[50]
而不是`char *' word
。 在这种情况下,请记得两次free
通话。 使用word=malloc(128);
这将为您的可变单词分配128个字节,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.