我有一个类似的结构
struct Patient {
char* name;
char* address;
char* socialSecurityNumber;
char* typeOfExamination;
bool isExpress;
}
我必须从这样的txt文件中填充这个结构的动态数组:(定界符:"(
Andrew;Address street first;123;pulmonary;1
Matthew;Address street second;456;COVID;0
Lisa;Address street third;789;rectum;0
打开文件并读取文件后:
while (fgets(line, 255, (FILE*) fPtr)) {
char *p = strtok (line, ";");
patients[i].name=(char*)malloc(sizeof(char*));
strcpy(patients[i].name, p);
p = strtok (NULL, ";");
patients[i].address=(char*)malloc(sizeof(char*));
strcpy(patients[i].address, p);
...
i++;
}
在第二个malloc/strcpy之后,我得到一个sysmalloc:Assertion失败错误
我做错了什么?
patients[i].name=(char*)malloc(sizeof(char*));
为单个字符指针分配了足够的空间,大约4到8个字节。您需要为每个字符分配足够的空间,再加上末尾的一个空字节。
patients[i].name = (char*)malloc(sizeof(char) * (strlen(p)+1));
这是可行的,但我们可以把它缩小。不需要铸造malloc
。通常我们也将长度乘以类型sizeof
,但sizeof(char)
总是1,因此可以省略它。
patients[i].name = malloc(strlen(p)+1);
您可以使用strdup
来做同样的事情,但这是一个POSIX函数,并不总是可用的。写自己的东西通常是值得的。
patients[i].name = strdup(p);