代码之家  ›  专栏  ›  技术社区  ›  Kurakami Genya

在C中使用带节点的链表时,是否会出现内存溢出?这种情况通常发生吗?

  •  0
  • Kurakami Genya  · 技术社区  · 1 年前

    我正在进行一个编程练习,重点是在C中使用链表,这就是我如何定义节点结构和使用它的一些函数:

    typedef struct log{
        struct log* next;
        long time;
        int status;
        char plate[];
    }log;
    
    log* init_lg(long t, int st, char pl[])
    {
        log* p = (log*)malloc(sizeof(log));
        p->time = t; p->status = st; strcpy(p->plate, pl);
        p->next = NULL;
        return p;
    }
    
    void ins_lg(long t, int st, char pl[])
    {
        if (lg == NULL)
        {
            lg = init_lg(t, st, pl);
            return;
        }
        log* i = lg;
        while (i->next != NULL) i = i->next;
        i->next = init_lg(t, st, pl);
    }
    

    然而,我发现 ins_lg 函数无法与正常工作 pl[] 长度超过7的字符串参数。

    我不能缩小它的尺寸 pl[] 不幸的是,由于输入数据的原因,参数的长度必须大于7。那么,会有一个好的解决方案吗?

    例如,我尝试过 pl[] 是“1234567”,运行良好,但当我更改 pl[] 进入“12345678”后,它似乎陷入了冻结状态,并在相当长的延迟后发出了一个返回代码为-103740940的进程。

    我认为问题可能只是内存溢出,因为我测试了所有的函数,它们可以很好地使用更短(当然也更小)的参数值。

    1 回复  |  直到 1 年前
        1
  •  0
  •   dbush    1 年前

    这个 plate 未指定成员的大小。考虑到它是的最后一个成员 struct ,这使它成为 柔性阵列构件 .

    这样的成员实际上没有任何空间,所以 malloc(sizeof(log)) 没有为此成员分配任何空间。这意味着任何写入 盘子 正在写入超过已分配内存的末尾,触发 undefined behavior .

    除了结构本身之外,还需要为要存储的字符串分配足够的空间:

    log* p = malloc(sizeof(log) + strlen(pl) + 1);