我想实现一个程序,该程序在链接列表中使用链接列表(它模拟超市流量以获取您的信息),执行添加,删除,删除等操作。这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct cash_queue cash;
typedef struct client client;
typedef struct item item;
int k,c;//k== cash registers,c == customers
struct item{
int value;
struct item* next;
};
struct cash_queue{
int cash_num;
struct client *first;
struct cash_que* next;
};
struct client{
int client_num;
int items;
struct item *fitem;
struct client* next;
};
void create_item(item* fitem){
item *item,*cur;
cur=fitem;
item=malloc(sizeof(item));
printf("give product value\n");
int v;
scanf(" %d",&v);
item->value=v;
printf("value: %d\n",item->value);
item->next=NULL;
while (cur->next)
cur=cur->next;
cur->next=item;
}
void create_queue(client* first){
client *client,*cur;
cur=first;
client=malloc(sizeof(client));
printf("how many items this client has?\n");
int x,i;
scanf("%d",&x);
client->items=x;
client->next=NULL;
client->fitem=malloc(sizeof(item));
for (i=1;i<=x;++i)
create_item(client->fitem);
while (cur->next){
cur=cur->next;
}
cur->next=client;
}
int main(){
cash* ncash;
ncash=malloc(sizeof(cash));
ncash->cash_num=1;
ncash->next=NULL;
ncash->first=malloc(sizeof(client));
printf("give the number of starting customers\n");
scanf("%d",&c);
int i;
for(i=1;i<=c;++i)
create_queue(ncash->first);
}
当我尝试执行此代码时,我的程序会中止。确切的输出是:
give the number of starting customers
3
how many items this client has?
1
give product value
2
value: 2
aa: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed.
Aborted
你能告诉我为什么会这样,我该如何解决?谢谢。还有其他问题我应该在我的代码中纠正吗?
答案 0 :(得分:1)
正如我在评论中所写,错误消息可能意味着您以某种方式滥用动态分配的内存。看看你的代码,确实是这样的。您有此模式的多个实例:
typedef struct foo foo;
struct foo {
// elements ...
};
void f() {
foo *foo;
foo = malloc(sizeof(foo));
// ... populate foo ..
}
你在其中混淆了自己,或编译器,或两者都试图过于聪明。包含foo
调用的语句中的malloc()
都是相同的:变量 foo
,它是struct foo *
类型的指针。除非struct foo
的大小恰好与系统上指针的大小相同,否则这是错误的。如果结构大于指针,则写入其某些成员确实会超出分配的边界。
有几种方法可以解决这个问题。我肯定会建议你在命名方面更有特色。我建议你也不要使用typedef - 你的类型不是那么复杂,以至于你获得了很多东西,而且代码清晰度也很高。此外,我建议您使用所有 malloc()
来电:
bar = malloc(n * sizeof(*bar));
观察到在分配多个字节时很清楚,这些字节是目标指针所指向的对象类型大小的倍数,但它并不直接依赖于bar
的类型实际是。总的来说,那么:
struct bar {
// elements ...
};
void f() {
struct bar *temp_bar;
temp_bar = malloc(sizeof(*temp_bar));
// ... populate temp_bar ..
}