我今天很难修复代码,然后我遇到了类似的东西:
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 Bytes
分配struct
。有没有解决这个问题的方法,而不是将char*
变成像char word[50]
那样?
答案 0 :(得分:20)
您只为结构本身分配内存。这包括指向char的指针,它在32位系统上只有4个字节,因为它是结构的一部分。它不包含未知长度的字符串的内存,因此如果您想要一个字符串,您还必须手动为其分配内存。如果您只是复制字符串,则可以使用strdup()
来分配和复制字符串。你仍然必须自己释放记忆。
mystruct* structptr = malloc(sizeof(mystruct));
structptr->word = malloc(mystringlength+1);
....
free(structptr->word);
free(structptr);
如果您不想自己为字符串分配内存,那么您唯一的选择就是在结构中声明一个固定长度的数组。然后它将成为结构的一部分,sizeof(mystruct)
将包含它。如果这适用与否,取决于您的设计。
答案 1 :(得分:3)
为malloc
word
mystruct* structptr = malloc(sizeof(mystruct));
structptr->word = malloc(sizeof(char) * N);
答案 2 :(得分:3)
正如您可以阅读here,您需要单独分配char *
:
mystruct* structptr = malloc(sizeof(mystruct));
structptr->word = malloc(sizeof(WhatSizeYouWant));
答案 3 :(得分:1)
为structptr
分配内存时,word
中的指针struct
没有指向有效内存。因此,您malloc
也可以word
一段记忆,或者word
指向另一个角色。
答案 4 :(得分:0)
malloc外部struct只分配*word
指向的1字节内存,因为它是'char *'类型。如果要分配word
指向的超过1个字节的内存,则有2个选项:
char word[50]
而不是`char *'word
。在这种情况下,请务必两次致电free
。答案 5 :(得分:-2)
使用word=malloc(128);
这将为您的可变字
分配128个字节