【问题标题】:Memory allocation of a list within a list in CC中列表中列表的内存分配
【发布时间】:2021-08-19 21:05:22
【问题描述】:

我是第一次提出问题,我会尽量简洁,我正在尝试为列表中的列表分配空间,然后访问其成员( int begin int end )。

typedef struct patient{
    int id_patient;
    int id_medic;
    char name[15];
    float presale;
    struct seq *sequence;
}patient;

typedef struct seq{
    int begin;
    int end;
    struct seq *next;
}seq;

struct patient* patient_list;
patient_list = malloc(sizeof(patient));

但是我无法访问内部列表中的数据

patient_list->sequence->begin = 10
printf("%d",patient_list->sequence->begin)

代码以0xC0000005退出,这应该是由于如何访问非法内存区域。

为什么会发生这种情况?我只写了感兴趣的代码,因为上面的列表有效。

【问题讨论】:

    标签: c memory allocation


    【解决方案1】:

    您已经为patient 结构本身分配了空间,但是该结构中的sequence 指针未初始化。您需要为该序列分配内存,例如

    patient_list->sequence = malloc(sizeof(seq) * n);
    

    其中n 是列表中的条目数。如果seq 结构中的next 指针的意图是指向列表中的下一个条目,则还需要在列表的每个条目中初始化这些指针。

    【讨论】:

      【解决方案2】:

      您的代码中存在问题的部分是您为patient 结构分配了内存,但没有为patient 结构中的seq 结构分配内存。本质上,您为 sequence 指针分配了内存,但没有为它指向的位置分配内存。

      这是一个简单的例子:

      typedef struct patient{
          int id_patient;
          int id_medic;
          char name[15];
          float presale;
          struct seq *sequence;
      }patient;
      
      typedef struct seq{
          int begin;
          int end;
          struct seq *next;
      }seq;
      
      int main()
      {
          struct patient* patient_list;
          patient_list = (patient*) malloc(sizeof(patient));
          patient_list->sequence = (seq*) malloc(sizeof(seq)); // we need to allocate the memory here
          patient_list->sequence->next = NULL;
      
          patient_list->sequence->begin = 10;
          printf("%d",patient_list->sequence->begin);
      
          return 0;
      }
      

      【讨论】:

        【解决方案3】:

        在您可以读取或写入sequence 指向的seq 之前,您需要为其分配内存。

        patient_list->sequence = malloc(sizeof (seq) );
        patient_list->sequence->begin = 10;
        printf("%d",patient_list->sequence->begin);
        

        如果您尝试从未指向有效内存的指针读取或写入,您将获得未定义的行为,并且异常 0xC0000005 是典型的结果。

        请注意,seq 在其next 指针中仍然有一个未初始化的值,如果使用这同样是灾难性的。因此,您需要仔细构建数据序列,每个条目都被初始化并指向下一个条目。

        【讨论】:

          猜你喜欢
          • 2014-10-03
          • 1970-01-01
          • 2017-07-24
          • 1970-01-01
          • 2019-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-14
          相关资源
          最近更新 更多