我正在编写玩具语言编译器的代码。这是代码的片段。在main
中有两个功能:createlist
和node
。当一个被注释掉时,另一个工作正常,但它一起显示了一个我不理解的错误。任何帮助表示赞赏。
#include <stdio.h>
#include <stdlib.h>
struct node { //declaration for node
int tokenno;
struct node * next ;
};
struct node * newnode(int a) // to create a new node
{
struct node * new1 = (struct node *)malloc(sizeof(struct node));
printf("\n malloc sucees");
(*new1).tokenno = a ;
(*new1).next = NULL ;
printf("\new node sucess\n");
return (new1);
};
struct firstlist{
int size ;
struct node * list[10];
};
typedef struct firstlist * plist;
plist createlist(){ //fun to create a first list
int i ;
plist p = (plist) malloc(sizeof(struct firstlist));
(*p).size = 10 ;
for(i = 0 ; i <=10;i++){ //initializing list[i] to NULL
(*p).list[i] = NULL ;
}
printf("\n created sucessfully");
return p;
}
int main(){
plist p ;
//p = createlist(); // If you comment createlist the new node works fine
//getfirstset(p);
//insert(1,5,p);
newnode(2);
}
如果您注释掉newnode
,那么createlist
可以正常工作,但它一起显示以下错误:
a.out: 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.
created sucessfullyAborted
答案 0 :(得分:3)
它崩溃的原因是你在createlist
函数的数组边界外写:
for(i = 0 ; i <= 10; i++)
应该是:
for(i = 0 ; i < 10; i++)
当您注释掉newnode
功能时,它仍然无法正常工作,但它不会崩溃的原因是没有更多内存访问会触发内存错误。< / p>
可能还有其他问题,但更改此问题并运行该程序。
在旁注中,您创建的节点永远不会被放入列表中,但是您可能还没有编写代码的那部分(我想这将是插入函数)。
此外,您可以写(*p).size
而不是p->size
,这对许多人来说更具可读性。
最后:当您宣布main
返回int
时,您应该使用return 0;
语句结束该计划。