繁体   English   中英

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

[英]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);

你可以在这里阅读你需要分别分配char *

mystruct* structptr = malloc(sizeof(mystruct));
structptr->word = malloc(sizeof(WhatSizeYouWant));

当您分配内存structptr ,指针wordstruct没有有效的记忆点。 让你无论是malloc一块内存的word ,也还是让word点到另一个角色。

malloc外部struct只分配*word指向的1字节内存,因为它是'char *'类型。 如果要分配超过1个字节的内存word ,有2个选项:

  1. 就像你说的那样,把它声明为char word[50]而不是`char *'
  2. malloc / calloc(我个人更喜欢calloc,省去了zeromemory的麻烦,这是非常重要的..)外部结构,然后malloc / calloc也是内部word 在这种情况下,请记得两次free通话。

使用word=malloc(128);

这将为您的可变单词分配128个字节,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM