【发布时间】:2013-05-04 15:31:42
【问题描述】:
从下面的图片中可以看出,添加列表顶部的第二个元素会为 printf 函数创建一个奇怪的行为。
添加列表节点的功能是:
void add_QUEUEnode_top(Item a)
{
if (head==NULL)
{
QUEUEinit(a);
}
else
{
QUEUEput_top(a);
}
return;
}
void QUEUEinit(Item a)
{
head=(link)malloc(sizeof(link*));
head->next=NULL;
head->item=a;
tail=head;
printf("Coda iniziallizata...\n\n");
}
void QUEUEput_top(Item a)
{
link tmp;
tmp=(link)malloc(sizeof(link*));
tmp->item=a;
tmp->next=head;
head=tmp;
return;
}
这里是处理项目的函数:
Item fill_item()
{
Item a;
int i;
for(i=0; i<DIM-1; i++)
{
a.stringa[i]=rand();
}
a.stringa[DIM-1]='\0';
a.numero=rand();
printf("\nOggetto generato: \n");
print_item(a);
return a;
}
void print_item(Item a)
{
printf("\nStringa elemento: ");
printf("%s", a.stringa);
printf("\nNumero elemento: %d\n", a.numero);
}
Here 是我正在编辑的代码块项目的链接。调用“bugged” printf 的函数print_item(Item a) 位于item.c 模块中,而生成列表项的函数位于list.c 模块中。
知道什么会导致这个问题吗?
PS:对于位于意大利语的捕获感到抱歉
编辑:项目的定义:
typedef struct
{
char stringa[DIM];
int numero;
} Item;
链接指针的定义:
typedef struct QUEUEnode *link;
链接结构的定义:
struct QUEUEnode
{
Item item;
link next;
};
【问题讨论】:
-
link和Item的定义是什么?我会注意到看起来像head=(link)malloc(sizeof(link*));的行是可疑的。投射到与您使用的尺寸不同的类型?实际上,在 C 中甚至根本不需要演员阵容,但你需要做一个疯狂的演员这一事实更有说服力.... -
首先,
malloc(sizeof(link*))行并没有分配您认为的内容。它为指针分配了足够的内存(即 4 或 8 个字节),这很可能不足以满足您的link结构。