重写内存?在C中调用结构时使用malloc

重写内存?在C中调用结构时使用malloc,c,C,我在为以下结构分配内存时遇到问题: typedef struct level { char* raw_map; // original string representing the level map char* name; // level name char* description; // level description char* password; // level password struct

我在为以下结构分配内存时遇到问题:

    typedef struct level {
    char* raw_map;      // original string representing the level map
    char* name;         // level name
    char* description;  // level description
    char* password;     // level password
    struct level *next; // pointer to the next level
} LEVEL;
我的函数如下所示:

LEVEL* parse_level(char* line){

    LEVEL *level =(LEVEL*)malloc(sizeof(LEVEL));

    int i=0;

    level->name = (char*)malloc(sizeof(level->name));
    while(line[i] != ';'){
       level->name[i]= line[i];
       i++;
    }
    level->password =(char*)malloc(sizeof(level->password));
    i++;
    while(line[i] != ';'){
       level->password[i]= line[i];
       i++;
    }
    return level;
到目前为止,我只设置了前两种类型的结构

我这样称呼funciton:

int main(){

    LEVEL *first = (LEVEL*)malloc(sizeof(LEVEL));
    first =  parse_level("nameoffirstlevelwillbehere;mandragoramo5000");
    printf("name: %s pass: %s\n",first->name, first->password);
}
我不确定这个问题在malloc结构中的某个地方,因为我第一次在函数中使用指针,所以我不确定它们是否放置正确。当我有这样的代码时,在first->name中只有12个字符,而不是完整的字符串,直到第一个“;”。在级别->密码中也发生了同样的情况。谢谢你的帮助

level->name
是指针。所以

sizeof(level->name)
返回平台上指针的大小。这在编译时是已知的。事实上,这是需要记住的。
sizeof
运算符在编译时计算。因此,它不能用于调整动态大小内存的分配大小

相反,您需要分配足够的内存来容纳所需的字符串长度,包括空终止符

您需要首先遍历
,以找到字符串的长度。正如您目前所做的,正在寻找分号分隔符。然后可以分配字符串的内存并最终复制它

请注意,当前代码假定
中的字符串格式正确。如果它没有足够数量的分号,您将读取缓冲区的末尾。谨慎的做法是检查这种可能性

malloc
函数返回可分配给任何指针类型的
void*
。所以铸造是不必要的,通常最好避免铸造。

这是你的问题

level->name = (char*)malloc(sizeof(level->name));
这里的
level->name
是一个
char
指针。因此
sizeof
只返回指针的大小(通常为4字节)。您需要为它分配足够的内存

level->name = malloc(sizeof(char)*100);
级别->密码执行相同操作

记住不应该
level->name=(char*)malloc(sizeof(level->name))be


level->name=(char*)malloc(strlen(line->name)+1

在为其分配内存之前,我们需要计算名称和密码的长度,或者您可以为其选择默认的最大大小

LEVEL* parse_level(char* line){

    LEVEL *level =(LEVEL*)malloc(sizeof(LEVEL));
    if (level == NULL) return NULL;

    int i=0, name_length=0;

    //calculate name length first, if MAX_SIZE is known then it can be dropped.        

    while(line[i] != ';') {
       i++;
    }

    level->name = (char*)malloc(i+1);
    if (level->name == NULL) {
        free(level);
        return NULL;
    }
    name_length = i;

    i = 0;
    while(line[i] != ';'){
       level->name[i]= line[i];
       i++;
    }
    level->name[i] = '\0';   

    // Calculating password length
    i++;
    while(line[i] != ';'){
       i++;
    }

    level->password = (char*)malloc(i - name_length);
    if (level->password == NULL) {
        free(level->name);
        free(level);
        return NULL;
    }

    i = name_length + 1;

    while(line[i] != ';') {
      level->password[i] = line[i];
      i++;
    }
    level->password[i] = '\0';


    return level;
  }

不,不应该。因为起始行是一个字符串,终止符是一个分号。你怎么知道100就足够了?还有一件事,我可以用level->name=malloc(strlen(line))或者它不好,因为函数中的行是指针。空终止符需要是strlen(line)+1。但太长,因为行包含多个用分号分隔的字段。您没有找到空终止符No。不是malloc错误检查。你也错过了。您分配了字符串,但未能为null终止它们。根据定义,sizeof(char)也是1。