Realloc:结构的动态向量中的下一个大小无效

Realloc:结构的动态向量中的下一个大小无效,c,vector,realloc,C,Vector,Realloc,我试图让这段代码正常工作,但我不明白为什么它会崩溃。它应该从文件中读取数据,并将其排序(插入排序)到向量中。proc是进程t的向量,proc.name是字符[10],proc[0]插入在前面(硬编码),num_proc==1。文件的第一个寄存器被正确捕获,但随后崩溃(仅在realloc()中) 我刚意识到重新分配时错过了a+1。我在分配我已经拥有的东西(起初我有1个,分配1个,然后插入1个)。向量的第一个元素是靠运气插入的。很难发现的愚蠢错误。在此之前,您为proc分配了内存吗?或者将proc初

我试图让这段代码正常工作,但我不明白为什么它会崩溃。它应该从文件中读取数据,并将其排序(插入排序)到向量中。proc是进程t的向量,proc.name是字符[10],proc[0]插入在前面(硬编码),num_proc==1。文件的第一个寄存器被正确捕获,但随后崩溃(仅在realloc()中)


我刚意识到重新分配时错过了a+1。我在分配我已经拥有的东西(起初我有1个,分配1个,然后插入1个)。向量的第一个元素是靠运气插入的。很难发现的愚蠢错误。

在此之前,您为
proc
分配了内存吗?或者将
proc
初始化为
NULL
?proc的大小为1个结构。我刚刚意识到在重新分配大小时我错过了a+1。愚蠢的错误是最难发现的。@JoachimPileborg,from MAN:realloc()将ptr指向的内存块的大小更改为字节大小。内容物将保持不变,以旧尺寸和新尺寸的最小值为准;新分配的内存将被取消初始化。如果ptr为NULL,那么对于size的所有值,调用相当于malloc(size);如果size等于零,并且ptr不为NULL,则调用相当于free(ptr)。除非ptr为NULL,否则它必须是通过先前调用malloc()、calloc()或realloc()返回的。如果指向的区域已移动,则执行自由(ptr)。空是好的,单位化是坏的。
    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);
    }