在结构中使用malloc

在结构中使用malloc,c,struct,malloc,C,Struct,Malloc,我一直在阅读这里的一些帖子,观看一些YouTube视频,努力让malloc“点击”我正在尝试完成的任务 如果这是重复的,我会提前道歉,但我在另一个帖子上找不到明确的答案 假设我有一个定义个人数据的结构,声明如下: struct strDate { int nDay; int nMonth; int nYear; }; struct strTime { int

我一直在阅读这里的一些帖子,观看一些YouTube视频,努力让malloc“点击”我正在尝试完成的任务

如果这是重复的,我会提前道歉,但我在另一个帖子上找不到明确的答案

假设我有一个定义个人数据的结构,声明如下:

    struct strDate
    {
        int     nDay;
        int     nMonth;
        int     nYear;
    };

    struct  strTime
    {
        int     nSeconds;
        int     nMinutes;
        int     nHours;
    };

    struct strName
    {
        char            arcTitle[10];
        char            arcFirstName[50];
        char            arcMiddleName[50];
        char            arcSurname[50];
    };

    struct strPerson
    {
        struct strDate  strDOB;
        struct strName  strFullName;
        struct strTime  strStartTime;
        struct strDate  strStartDate;
        char            arcJobTitle[31];
        int             nEmployeeNumber;
    };
    // Variable Declarations
    struct strPerson    Person[5];
我目前对Malloc的理解如下:

    struct strDate
    {
        int     nDay;
        int     nMonth;
        int     nYear;
    };

    struct  strTime
    {
        int     nSeconds;
        int     nMinutes;
        int     nHours;
    };

    struct strName
    {
        char            arcTitle[10];
        char            arcFirstName[50];
        char            arcMiddleName[50];
        char            arcSurname[50];
    };

    struct strPerson
    {
        struct strDate  strDOB;
        struct strName  strFullName;
        struct strTime  strStartTime;
        struct strDate  strStartDate;
        char            arcJobTitle[31];
        int             nEmployeeNumber;
    };
    // Variable Declarations
    struct strPerson    Person[5];
Malloc可用于确定存储值需要多少内存(取决于类型和大小等)。这可以通过在指向列表中下一个值的每个值的末尾放置指针来创建链接列表

我如何将malloc应用到我的代码中

假设我有一个结构数组,如下所示:

    struct strDate
    {
        int     nDay;
        int     nMonth;
        int     nYear;
    };

    struct  strTime
    {
        int     nSeconds;
        int     nMinutes;
        int     nHours;
    };

    struct strName
    {
        char            arcTitle[10];
        char            arcFirstName[50];
        char            arcMiddleName[50];
        char            arcSurname[50];
    };

    struct strPerson
    {
        struct strDate  strDOB;
        struct strName  strFullName;
        struct strTime  strStartTime;
        struct strDate  strStartDate;
        char            arcJobTitle[31];
        int             nEmployeeNumber;
    };
    // Variable Declarations
    struct strPerson    Person[5];
假设我想先用空白占位符填充数据(以防止从内存中提取垃圾值),然后用数据填充结构,我如何确保它在malloc中使用了适当的内存量

我目前在没有malloc的情况下这样做,但我认为这是低效的,因为可能会超过一个字符串数组长度。无论如何:

// Blank Data
for (nCount = 0; nCount < 5; nCount++)
        fnDefaultBlankPersonData(&Person[nCount]); // fills all structures with blank data to avoid unusual values pulled from memory


// Real Data
fnPopulatePersonData(&Person[0], "Mr", "PlaceholderFirst", "PlaceholderMiddle", "PlaceholderLast", "PlaceholderJobTitle", 1, 1, 1980, 1, 9, 2001, 8, 0, 0, 6);
//空白数据
对于(nCount=0;nCount<5;nCount++)
fnDefaultBlankPersonData(&Person[nCount]);//用空白数据填充所有结构,以避免从内存中提取异常值
//真实数据
fnpoplatepersondata(&Person[0],“Mr”,“占位符优先”,“占位符中间”,“占位符最后”,“占位符职务”,1,1,1980,1,9,2001,8,0,0,6);
主要关注上面的“真实数据”填充:如何确保结构的大小适当以适合数据,并且如果要重新运行函数以重新填充它,如何调整结构的大小


(上面的两个函数只是用=和strcpy()为结构赋值)

函数不用于确定存储值需要多少内存。
sizeof
操作符执行此操作

malloc
所做的是动态分配给定数量的内存供程序使用

在您的用例中,看起来不需要
malloc
。您希望清除一段内存,使其包含已知值。如果希望所有字节都包含0,可以使用
memset
函数:

for (nCount = 0; nCount < 5; nCount++)
    memset(&Person[nCount], 0, sizeof(Person[nCount]);

malloc
函数不用于确定存储值需要多少内存。
sizeof
操作符执行此操作

malloc
所做的是动态分配给定数量的内存供程序使用

在您的用例中,看起来不需要
malloc
。您希望清除一段内存,使其包含已知值。如果希望所有字节都包含0,可以使用
memset
函数:

for (nCount = 0; nCount < 5; nCount++)
    memset(&Person[nCount], 0, sizeof(Person[nCount]);

感谢您提供有关memset清空数据的提示。然而,对于第二个代码段的第二部分,我正在用数据填充结构-但是如果说,我尝试插入的字符串值之一超过了它定义的大小,那会怎么样?如果您这样做,您将调用@CharlieWebb。因此,您的代码需要知道缓冲区的大小(在本例中很容易,因为缓冲区是固定大小的),并且不能超过它。
memset(&Person[nCount],0,sizeof(Person[nCount])
不太可能是正确的。似乎您正在将分配的内存后的空间归零。@user694733当您声明变量时,如果它未初始化,则其内容是未指定的。因此,如果您希望知道内容,则需要以某种方式对其进行设置,例如使用memset。我知道,这不是我的意思。使用
nCount
在这种情况下,闻起来像是一个错误。更可能的情况是您应该编写
memset(Person,0,sizeof Person)
感谢您提供有关memset清空数据的提示。但是,对于第二个代码段的第二部分,我正在用数据填充结构-但是如果说,我尝试插入的一个字符串值超出了它定义的大小?@CharlieWebb,如果您调用它。因此,您的代码需要知道该字符串的大小缓冲区(在这种情况下很容易,因为缓冲区的大小是固定的)并且不会超过它。
memset(&Person[nCount],0,sizeof(Person[nCount])
不太可能是正确的。似乎您正在将分配的内存后的空间归零。@user694733当您声明变量时,如果它未初始化,则其内容是未指定的。因此,如果您希望知道内容,则需要以某种方式对其进行设置,例如使用memset。我知道,这不是我的意思。使用
nCount
在这种情况下,闻起来像是一个错误。更可能的情况是您应该编写
memset(Person,0,sizeof Person);