10

我今天正在努力修复代码,然后我遇到了类似的东西:

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]

4

6 回答 6

22

您只为结构本身分配内存。这包括指向 char 的指针,它在 32 位系统上只有 4 个字节,因为它是结构的一部分。它不包括未知长度字符串的内存,所以如果你想要一个字符串,你也必须手动为其分配内存。如果你只是复制一个字符串,你可以使用strdup()which 分配和复制字符串。不过,您仍然必须自己释放内存。

 mystruct* structptr = malloc(sizeof(mystruct));
 structptr->word = malloc(mystringlength+1);

 ....

 free(structptr->word);
 free(structptr);

如果您不想自己为字符串分配内存,您唯一的选择是在结构中声明一个固定长度的数组。然后它将成为结构的一部分,sizeof(mystruct)并将包括它。这是否适用,但取决于您的设计。

于 2013-08-15T07:27:04.783 回答
3

malloc为您需要的任何长度 (N)添加一秒word

   mystruct* structptr = malloc(sizeof(mystruct));

   structptr->word = malloc(sizeof(char) * N);
于 2013-08-15T07:27:50.427 回答
3

如您在此处阅读的,您需要char *单独分配:

mystruct* structptr = malloc(sizeof(mystruct));
structptr->word = malloc(sizeof(WhatSizeYouWant));
于 2013-08-15T07:29:29.877 回答
1

当您为 分配内存时structptr, 中的指针没有可指向的有效内存wordstruct因此,您要么为, 也malloc留下一段记忆,要么指向另一个角色。wordword

于 2013-08-15T07:28:04.940 回答
0

malloc 外部结构将只分配 1 字节的内存,*word因为它是 'char *' 类型。如果要分配 1 字节以上的内存word,有 2 个选项:

  1. 就像你说的那样,声明它char word[50]而不是'char *'
  2. malloc/calloc(我个人更喜欢calloc,省去了zeromemory的麻烦,这很重要..)外部结构,然后是内部结构的malloc/calloc wordfree记住在这种情况下也要调用两次。
于 2013-08-15T07:33:59.033 回答
-2

利用word=malloc(128);

这将为您的变量字分配 128 个字节,

于 2013-08-15T07:27:53.647 回答