2014-09-28 3 views
-1
#include<stdio.h> 
#include<stdlib.h> 

struct node 
{ 
    int value; 
    struct node* next; 
} *graph; 

int main(void) 
{ 
    int V,E,i,u,v; 
    struct node *ptr,*ptr1; 
    ptr=malloc(sizeof(struct node *)); 
    ptr1=malloc(sizeof(struct node *)); 
    scanf("%d",&V); 
    graph=malloc(V*(sizeof(struct node *))); 
    if(!graph) 
     printf("Not allocated"); 

    for(i=0;i<V;i++) 
    { 
     graph[i].next=NULL; 
    } 

    scanf("%d",&E); 
    for(i=0;i<E;i++) 
    { 
     //printf("**\n"); 
     scanf("%d %d",&u,&v); 
     ptr=malloc(sizeof(struct node *)); 
     ptr1=malloc(sizeof(struct node *)); 
     ptr->value=u; 
     ptr->next=graph[v].next; 
     graph[v].next=ptr; 
     ptr1->value=v; 
     ptr1->next=graph[u].next; 
     graph[u].next=ptr1; 
    } 

    for(i=0;i<V;i++) 
    { 

     ptr=graph[i].next; 
     printf("**\n"); 
     printf("%d ===>\n",i); 
     while(ptr) 
     { 
      printf("%d->",ptr->value); 
      ptr=ptr->next; 
     } 
     printf("NULL\n"); 
    } 
} 

Я получаю следующее сообщение об ошибкеЯ реализую графа с использованием списка смежности

a.out: malloc.c: 2369: SysMalloc: Утверждение `(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) -> размер & 0x1) & & ((неподписанных долго) old_end & pagemask) == 0)»не удалось. Aborted (core dumped)

ответ

1

Первое, что бросается в глаза:

struct node *ptr,*ptr1; 
ptr=malloc(sizeof(struct node *)); 
ptr1=malloc(sizeof(struct node *)); 

PTR и ptr1 предназначены, чтобы указать на struct node с, но выделить место для struct node *. Это же замечание для .

+0

Спасибо. Получил мою ошибку. Но в некоторых программах «malloc (sizeof (struct node *)) он работал, есть ли какие-либо объяснения для этого? – user2711221

+0

* Неопределенное поведение *. C и C++ не проверяют переполнение памяти, поэтому слишком большой текст Маленький выделенный блок просто перезаписывает материал за ним. Если вам повезет, программа выйдет из строя, и вы увидите свою ошибку. Если вы этого не сделаете, ошибка останется незамеченной, пока она случайно не сработает после другого изменения позже. – Quentin

0

Вы уверены, что эти вызовы scanf работают? Вы уверены, что входные значения находятся в диапазоне 0 .. V-1?

Я предлагаю добавить проверку ошибок для обоих из них.

Также эти первые ptr и ptr1 mallocs не используются.

Смежные вопросы