使用C中的字符指针为结构分配内存

时间:2013-08-15 07:24:30

标签: c pointers memory struct malloc

我今天很难修复代码,然后我遇到了类似的东西:

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]那样?

6 个答案:

答案 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

所需的长度(N)添加第二个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个选项:

  1. 与您所说的一样,将其声明为char word[50]而不是`char *'
  2. malloc / calloc(我个人更喜欢calloc,省去了zeromemory的麻烦,这是非常重要的..)外部结构,然后malloc / calloc也是内部word。在这种情况下,请务必两次致电free

答案 5 :(得分:-2)

使用word=malloc(128);

这将为您的可变字

分配128个字节