我创建了这个名为User的结构,它存储了所有类型的数据, 现在我正在尝试创建一个数组(User *)并从文件中获取数据, 这就是我在主程序开始时所做的事情:
int amount = 0;
User* users = NULL;
// read from file functions
loadUsers(&users,&amount);
功能(用户数量是我的txt文件的第一行):
void loadUsers(User** users,int* amount2){
int amount, i = 0, j;
char temp[STRING_SIZE], temp2[STRING_SIZE];
FILE* f;
f = fopen("input.txt", "r");
if (!f){
return;
}
if (fileEmpty(f)){
return;
}
fscanf(f, "%d", &amount);
*amount2 = amount;
*users = malloc(sizeof(User)*amount);
/**users = (User*)malloc(sizeof(User)*amount);*/
while (!feof(f)){
fscanf(f, "%s", temp);
users[i]->ID = (char*)malloc(sizeof(char)*(strlen(temp) + 1));
strcpy(users[i]->ID, temp);
fscanf(f, "%s", temp);
users[i]->f_name = (char*)malloc(sizeof(char)*(strlen(temp) + 1));
strcpy(users[i]->f_name, temp);
fscanf(f, "%s", temp);
users[i]->l_name = (char*)malloc(sizeof(char)*(strlen(temp) + 1));
strcpy(users[i]->l_name, temp);
i++;
}
由于某些原因我得到一个错误并且在调试时我看到分配是错误的,因为我只有users[0]
而不是users[1]
,就像一个用户数组应该有,即使数量更高比1。
我的目标是拥有一个数组,每个数组都是一个用户。
可能是什么原因?
编辑: 用户结构:
struct User{
char* ID;
char* f_name;
char* l_name;
int age;
char gender;
char* username;
char* password;
char* description;
char** hobbies;
}typedef User;
答案 0 :(得分:2)
您可能正在调用未定义的行为,因为您没有在while循环中检查i < amount
,也没有检查fscanf()
是否成功读取了数据,如果失败,temp
数组的内容将是未初始化的,并且尝试将它们复制到malloc
ed poitners也是未定义的行为。
所以你的问题基本上是你的程序盲目地假设一切都按预期工作并可能调用未定义的行为,这个错误在新程序员中非常普遍。
您正在为amount
的{{1}}结构分配空间,但是您尝试在for循环中初始化User
amount
指针,您应该取消引用双指针它正常工作。
这是您自己的代码,其中包含一些可以防止未定义行为的检查
User
答案 1 :(得分:0)
双指针上的语法错误。而不是:
users[i]->ID = (char*)malloc(sizeof(char)*(strlen(temp) + 1));
strcpy(users[i]->ID, temp);
试试这个:
(*users)[i].ID = malloc(strlen(temp) + 1);
strcpy ((*users)[i].ID, temp);
等其他领域。