【问题标题】:Extending a Structure Array扩展结构数组
【发布时间】:2012-03-30 08:40:46
【问题描述】:

这是扩展结构数组的正确方法吗?

typedef struct { int x,y,z;} student_record;

int main(){

student_record data_record[30];       // create array of 30 student_records
num_of_new_records = 5;

data_record = realloc(data_record,(sizeof(data_record) + (sizeof(student_record)*num_of_new_records)));

// do I now have an array of 35 student_records???

【问题讨论】:

    标签: c struct realloc


    【解决方案1】:

    不 - 您不能分配给数组。您的代码甚至无法编译 - 您尝试过吗?

    如果您想realloc(),您需要使用malloc()(或其亲属之一):

    student_record *data_record = malloc(sizeof(student_record) * 30);
    

    您可能也不应该将realloc() 的返回值分配回原始变量。如果由于某种原因失败,您将丢失原始指针并泄漏该内存。

    【讨论】:

    • 那我应该用什么方法呢?创建一个更大尺寸的新临时数组并复制过来,然后 malloc() 第一个到我想要的大小并再次复制回来?
    • 如果要使用realloc(),请不要使用数组。使用指针和malloc()
    【解决方案2】:

    您应该遵循调用初始大小然后在必要时使用 realloc 的模式。重新分配的安全实践需要包括将返回的初始值分配给临时变量,并在验证没有错误后覆盖第一个值。像这样的:

     student_record *data_record = malloc(sizeof(student_record) * 30);
     student_record *tmp;
    
     // need larger size
     if ((tmp = realloc(data_record, new_size)) == NULL)
        perror(); //possibly exit as well since you're out of memory
     else
       data_record = tmp;
    

    【讨论】:

      【解决方案3】:

      您只能在堆上(动态分配)的对象上使用 realloc,因此您必须先进行 malloc。

      typedef struct { int x,y,z;} student_record;
      
      int main()  
      {
          student_record *data_record = malloc(sizeof(student_record)*30);
          assert(data_rocord);
          data_record = realloc(data_record, sizeof(student_record)*35);
          assert(data_record);
          free(data_record);
          exit(EXIT_SUCCESS);
      
      }
      

      【讨论】:

        猜你喜欢
        • 2013-06-11
        • 2018-03-12
        • 2014-09-20
        • 1970-01-01
        • 2017-09-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多