2013-11-20 47 views
0

我试图使此代码工作,但我不明白为什么它崩溃。它应该从文件中读取数据,并将其按照向量排序(插入排序)。 proc是Process_t的一个向量,proc.name是一个char [10],proc [0]是在(硬编码)和num_proc == 1之前插入的。该文件的第一个寄存器被正确捕获,但之后崩溃在realloc()中)。Realloc:动态向量中的结构无效的下一个大小

size = 1 
    while(size > 0) 
    { 
     // Read a process from the config file and add to the vector in a sorted way 
     printf("%d\n", num_proc); 
     proc = realloc(proc, sizeof(Process_t)*num_proc); 
     printf("%d\n", num_proc); 

     size = fscanf(cfgfd, "%hhd %s\n", &hwmodid, buf); 
     printf("%d %d %s\n", num_proc, hwmodid, buf); 

     i = num_proc-1; 
     while(i > 1 && proc[i].hwmodid > hwmodid) 
     { 
      strcpy(proc[i+1].name, proc[i].name); 
      proc[i+1].hwmodid = proc[i].hwmodid; 
      proc[i+1].pid = proc[i].pid; 
      proc[i+1].fiforfd = proc[i].fiforfd; 
      proc[i+1].fifowfd = proc[i].fifowfd; 
      proc[i+1].paused = proc[i].paused; 
      --i; 
     } 
     strcpy(proc[i+1].name, buf); 
     proc[i+1].hwmodid = hwmodid; 
     proc[i+1].pid = -1; 
     proc[i+1].fiforfd = -1; 
     proc[i+1].fifowfd = -1; 
     proc[i+1].paused = 0; 
     ++num_proc; 

     printf("%d %s %d %d %d %d %d\n", i, proc[num_proc-1].name, proc[num_proc-1].hwmodid, proc[num_proc-1].pid, proc[num_proc-1].fiforfd, proc[num_proc-1].fifowfd, proc[num_proc-1].paused); 
    } 
+0

在此之前你已经为'proc'分配了内存吗?或者将'proc'初始化为'NULL'? –

+0

proc具有1个结构的大小。我刚刚意识到我在重新分配大小时错过了+1。愚蠢的错误是最难找到的。 – markmb

+0

来自MAN的@JoachimPileborg:realloc()将ptr指向的内存块的大小更改为字节大小。内容将保持原有尺寸和最小尺寸的最小值;新分配的内存将被初始化。如果ptr为NULL,则对于所有大小的值,调用等价于malloc(size);如果size等于零,并且ptr不为NULL,那么调用等价于free(ptr)。除非ptr为NULL,否则它必须早先通过调用malloc(),calloc()或realloc()返回。如果指向的区域被移动,则完成一个空闲(ptr)。 NULL很好,单元化不好。 – Jekyll

回答

0

我刚刚意识到我错过了+1时重新分配。我正在分配我已有的东西(起初我有1,并且正在分配1并插入1)。插入的矢量的第一个元素是运气好的。很难找到的愚蠢错误。

相关问题