使用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个选项:
- 就像你说的那样,将它声明为
char word[50]
而不是`char *’ - malloc / calloc(我个人更喜欢calloc,省去了zeromemory的麻烦,这是非常重要的..)外部结构,然后malloc / calloc也是内部
word
。 在这种情况下,请记得两次free
通话。
使用word=malloc(128);
这将为您的可变字分配128个字节,