【问题标题】:How to malloc for different char pointers如何为不同的字符指针分配内存
【发布时间】:2021-02-13 04:08:25
【问题描述】:

我有一个这样的结构

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

我做错了什么?

【问题讨论】:

  • parients[i].name=strdup(p);,如果您的系统支持strdup()

标签: c pointers char malloc


【解决方案1】:

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

patients[i].name = (char*)malloc(sizeof(char) * (strlen(p)+1));

这行得通,但我们可以瘦身。 There's no need to cast malloc。通常我们也将长度乘以sizeof的类型,但是sizeof(char)总是1,所以可以省略。

patients[i].name = malloc(strlen(p)+1);

您可以使用strdup 做同样的事情,但这是一个 POSIX 函数并不总是可用。自己编写通常是值得的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多