我正在使用优先级为double的优先级队列。我猜这是问题的原因。我首先使用这些数字而没有任何问题。
34.365681 34.481879 34.539832 36.715120
然后我使用了这些数字并出现了分段错误。
45.411042 40.481879 37.702110 38.951187
struct PRIORITYQUEUE
{
int x_pq;
int y_pq;
double heuristic_pq;
int priority;
int info;
struct PRIORITYQUEUE *next;
}*start, *q, *temp, *new;
typedef struct PRIORITYQUEUE *N;
void insert(int x, int y, double heuristic)
{
int item;
double itprio;
//new = ( N* ) malloc( sizeof( N ) );
new = malloc( sizeof( N ) );
itprio = heuristic;
new->x_pq = x;
new->y_pq = y;
new->heuristic_pq = itprio;
if ( start == NULL || itprio < start->heuristic_pq )
{
new->next = start;
start = new;
}
else
{
q = start;
while ( q->next != NULL && q->next->heuristic_pq <= itprio )
q = q->next;
new->next = q->next;
q->next = new;
}
}
void del()
{
if ( start == NULL )
{
printf( "\nQUEUE UNDERFLOW\n" );
}
else
{
new = start;
printf( "\nDELETED ITEM IS %d\n", new->info );
start = start->next;
free( start );
}
}
void display()
{
temp = start;
if ( start == NULL )
printf( "QUEUE IS EMPTY\n" );
else
{
printf( "QUEUE IS:\n" );
while ( temp != NULL )
{
printf( "\t x is %d y is %d[heuristic=%lf] \n", temp->x_pq, temp->y_pq, temp->heuristic_pq );
temp = temp->next;
}
}
}
答案 0 :(得分:1)
您的问题在于此代码:
typedef struct PRIORITYQUEUE *N;
:
new = malloc( sizeof( N ) );
类型N
是您的结构的指针,而不是结构本身。这意味着sizeof(N)
可能比结构小得多,这意味着你没有分配足够的内存。
您可以通过在分配后立即插入来看到这一点:
printf ("%zd %zd\n", sizeof (N), sizeof (struct PRIORITYQUEUE));
并且您可能会看到4 32
或8 32
形式的一系列行,表明,当您分配四个或八个字节时,您< em>需要 32。
这就是造成你崩溃的原因。现在,关于如何修复它,它只是确保为结构分配足够的空间,这可以通过以下任何一种方式完成:
new = malloc (sizeof (struct PRIORITYQUEUE));
new = malloc (sizeof (*N));
但我更喜欢的是:
new = malloc (sizeof (*new));
我更喜欢的原因是它将分配数量与您使用的变量联系起来。虽然之前的两个将处理结构大小的任何更改,但这个更改仍然可以将new
声明为完全不同的结构,而无需在多个位置更改信息。
我的意思是,如果你改变new
的类型:
struct FASTER_PRIO_Q *new;
然后您将需要更改前两种情况的分配语句。第三个不是这样。