【问题标题】:Realloc: invalid next size in dynamic vector of structs [duplicate]Realloc:结构的动态向量中的下一个大小无效[重复]
【发布时间】:2013-11-20 13:34:48
【问题描述】:

我正在尝试使这段代码正常工作,但我看不出它为什么会崩溃。它应该从文件中读取数据,并将其排序(插入排序)放入向量中。 proc 是 Process_t 的向量,proc.name 是 char[10],proc[0] 插入之前(硬编码)和 num_proc == 1。文件的第一个寄存器被正确捕获,但随后它崩溃(只是在 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);
    }

【问题讨论】:

  • 在此之前您已经为proc 分配了内存?还是将proc初始化为NULL
  • proc 的大小为 1 个结构。我刚刚意识到我在重新分配大小时错过了 +1。最难发现愚蠢的错误。
  • @JoachimPileborg,来自 MAN:realloc() 将 ptr 指向的内存块的大小更改为 size 字节。内容将不变为新旧尺寸中的最小值;新分配的内存将未初始化。如果 ptr 为 NULL,则对于所有 size 值,调用等效于 malloc(size);如果 size 等于 0,并且 ptr 不为 NULL,则调用等效于 free(ptr)。除非 ptr 为 NULL,否则它一定是由先前对 malloc()、calloc() 或 realloc() 的调用返回的。如果指向的区域被移动,则执行 free(ptr)。 NULL 很好,未初始化是不好的。

标签: c vector realloc


【解决方案1】:

我刚刚意识到我在重新分配时错过了 +1。我正在分配我已经拥有的东西(起初我有 1,正在分配 1 并插入 1)。动态插入的向量的第一个元素是幸运的。难以发现的愚蠢错误。

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2011-02-25
    • 2012-10-31
    • 2014-05-18
    • 2018-06-13
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多