重写内存?在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。