首页 > 解决方案 > while 中的动态内存分配

问题描述

enum ev_type { ARRIVAL, DEP_Q0, DEP_Q1, DEP_Q2, DEP_Q3 };
struct node {
    double time;
    double duration;
    enum ev_type event;
    struct node * next;
}*evlist;
typedef struct node *nptr;
double min = 0;
void generate_new_customer(double clock, double duration)
{
    nptr newev = (nptr)malloc(sizeof(nptr));
    newev->duration = duration;
    newev->time = min;
    newev->event = ARRIVAL;

    if (evlist == NULL)
    {
        evlist = newev;
        evlist->next = NULL;
    }
    else
    {
        newev->next = evlist;
        evlist = newev;
    }
    printf("%lf\n", evlist->time);
}
int main() {
    start();
    while (1) {
        generate_new_customer(1, 6);
        if (min > 480)
            break;
        min++;
    }
    return 0;
}

我正在尝试使用函数进行内存分配。该函数按最小值工作。如果 min 增加 480,它会停止并中断。我检查了它。但仍然发生调试断言失败错误。我该怎么办?

标签: c

解决方案


malloc的不正确。它仅在您需要分配结构本身的大小时才分配指向您的结构的指针的大小。

改变:

nptr newev = (nptr) malloc(sizeof(nptr));

进入:

nptr newev = malloc(sizeof(struct node));

更新:

我注意到您的功能正在将您推到列表的前面。这不是错误,但您可以稍微简化一下:

您的原始代码:

if (evlist == NULL) {
    evlist = newev;
    evlist->next = NULL;
}
else {
    newev->next = evlist;
    evlist = newev;
}

轻微的重新排序:

if (evlist == NULL) {
    evlist = newev;
    newev->next = NULL;
}
else {
    newev->next = evlist;
    evlist = newev;
}

一些进一步的重新排序:

if (evlist == NULL) {
    newev->next = NULL;
    evlist = newev;
}
else {
    newev->next = evlist;
    evlist = newev;
}

因为newev->next = NULL在where is保证if的子句中,我们可以将其更改为:evlistNULL

if (evlist == NULL) {
    newev->next = evlist;
    evlist = newev;
}
else {
    newev->next = evlist;
    evlist = newev;
}

Now, both the if and the else are identical. So, we can eliminate the redundancy and we have:

newev->next = evlist;
evlist = newev;

推荐阅读