Falha de Segmentação

Iniciado por franckcv, 01 de Maio de 2011, 22:03

tópico anterior - próximo tópico

franckcv

Boa Noite a todos,

Estou tendo um problema de falha de segmentação em um código feito em c para criar um grafo. O meu problema surgiu quando implementei a função create_graph, por algum motivo na hora de fazer a leitura das arestas ele da falha de segmentação. Antes a função create_graph estava dentro do main e não dava erro mas uma vez que criei a função começo o erro.
Espero alguem posso me ajudar e agradeço qualquer dica. O código do meu programa vai a seguir.

#include<stdio.h>
#include<stdlib.h>

typedef struct vertex_neighbour{
   int label;
   int emarked;
}VN;

typedef struct vertex{
   int label;
   VN *vet;
   int vmarked;
   int neighbour_prox;   
}V;

typedef void* graph;

graph create_graph(int n){
   int i;
   V *list;
   list = malloc(n+1*sizeof(V));
   for(i=0;i<n;i++){
      list.label = i+1;
      list.vet = malloc(n*sizeof(VN));
      list.vet[0].label = 0;
      list.neighbour_prox = 0;
   }
   list.label = -1;
   return list;
}


void armazena( V l[],int n1,int n2){
   int k,i,j;printf("\n");
   k=0;
   while (l[k].label!=-1){
      printf("%d ",l[k].label);
      k++;
   }printf("\n");
   i = n1-1;
   l.neighbour_prox++;
   j = l.neighbour_prox;
   l.vet[j-1].label = n2;
   l.vet[j].label = 0;
}

void main(){
   int n, no1,no2,i,j;
   scanf("%d",&n);
   V *lista;
   graph G;

   G=create_graph(n);

   while(scanf("%d %d",&no1,&no2) > 0){
      armazena(G,no1,no2);
      armazena(G,no2,no1);
      printf("%d %d\n", no1,no2);
   }
   
   for(i=0;i<n;i++){
      printf("\nno = %d\n vizinhos (%d): ",lista.label,lista.vet[0].label);
      for(j=0;j<lista.neighbour_prox;j++){
         printf("%d ", lista.vet[j].label);
      }   
   }
printf("\n");
}


RonaldoRG

Deve ser porque sua função tá retornando um tipo V ao invés de graph:

graph create_graph(int n) <<<< Pelo protótipo da função retorna um tipo graph
{
   V *list;
   ...
   return list;  <<< Mas nessa lista tá retornando a estrutura V
}


T+.
Ubuntu 12.04

franckcv

Obrigado pela ajuda mas na verdade o problema não esta nessa função e sim na armazena. No create ele da certo sim ja que mesmo retornando o V ele nao tem problema ja que graph e um ponteiro tipo void.

fpissarra

A alocação de memória (malloc) em create_graph() está correta? Do jeito que está:

list = malloc(n+1*sizeof(V));

Você está alocando 'n' bytes mais o tamanho de 1 item do tipo 'V'. O correto não seria:

list = (V *)malloc(n * sizeof(V));

?