c - 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 = NULL
在where is保证if
的子句中,我们可以将其更改为:evlist
NULL
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;
推荐阅读
- swift - 以编程方式更改占位符文本颜色
- reactjs - 无法将深度克隆转换为 immer
- angular - 角度 6 重置一个数组对象也在重置另一个
- html - Bootstrap 响应式表单 - 标签放置
- java - 二叉树基础
- python-3.x - 我应该出于数据科学以外的其他原因在 Ubuntu WSL 上使用 Anaconda 吗?
- sql - 如何将列的子字符串(在一个表中)与另一列的完整值(在另一个表中)连接起来
- sql - 将链接表附加到一个表中?
- api - Service Fabric Web api 返回错误消息:参数无效,代码:E_INVALIDARG
- sql-server - 在 t-sql 中列成数组或逗号分隔列表