如何为不同的字符指针调用malloc

如何为不同的字符指针调用malloc,c,pointers,char,malloc,C,Pointers,Char,Malloc,我有一个这样的结构 struct Patient { char* name; char* address; char* socialSecurityNumber; char* typeOfExamination; bool isExpress; } 我必须从txt文件中填充此结构的动态数组,如下所示: (分隔符:“;”) 打开文件并读取文件后: while (fgets(line, 255, (FILE*) fPtr)) { char *

我有一个这样的结构

struct Patient {
    char* name;
    char* address;
    char* socialSecurityNumber;
    char* typeOfExamination;
    bool isExpress;
}
我必须从txt文件中填充此结构的动态数组,如下所示: (分隔符:“;”)

打开文件并读取文件后:

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-failed错误

我做错了什么?

患者[I].name=(char*)malloc(sizeof(char*))为单个字符指针分配足够的空间,大约4到8个字节。您需要为每个字符分配足够的空间,并在末尾添加一个空字节

patients[i].name = (char*)malloc(sizeof(char) * (strlen(p)+1));
那会管用的,但我们可以缩小规模。通常,我们还将长度乘以类型的大小,但是大小(char)
始终为1,因此可以忽略它

patients[i].name = malloc(strlen(p)+1);
您可以使用来做同样的事情,但是POSIX函数并不总是可用的。写自己的东西通常是值得的

patients[i].name = strdup(p);

parients[i].name=strdup(p)如果系统中支持
strdup()
patients[i].name = strdup(p);