繁体   English   中英

while 中的动态内存分配

[英]dynamic memory allocation in 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,它将停止并中断。 我查了一下。 但仍然发生调试断言失败错误。 我该怎么办?

您的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 = NULLevlist保证NULLif子句中,我们可以将其更改为:

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

现在, ifelse是相同的。 所以,我们可以消除冗余,我们有:

newev->next = evlist;
evlist = newev;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM