Autor Tópico: Falha de Segmentação  (Lida 2529 vezes)

Offline franckcv

  • Usuário Ubuntu
  • *
  • Mensagens: 2
    • Ver perfil
Falha de Segmentação
« Online: 01 de Maio de 2011, 22:03 »
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");
}

« Última modificação: 01 de Maio de 2011, 22:32 por franckcv »

Offline RonaldoRG

  • Usuário Ubuntu
  • *
  • Mensagens: 659
    • Ver perfil
    • Twitter: @rafas_andrade
Re: Falha de Segmentação
« Resposta #1 Online: 01 de Maio de 2011, 22:30 »
Deve ser porque sua função tá retornando um tipo V ao invés de graph:
Código: [Selecionar]
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

Offline franckcv

  • Usuário Ubuntu
  • *
  • Mensagens: 2
    • Ver perfil
Re: Falha de Segmentação
« Resposta #2 Online: 01 de Maio de 2011, 22:34 »
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.

Offline fpissarra

  • Usuário Ubuntu
  • *
  • Mensagens: 246
    • Ver perfil
    • Lost in the e-Jungle
Re: Falha de Segmentação
« Resposta #3 Online: 02 de Maio de 2011, 19:35 »
A alocação de memória (malloc) em create_graph() está correta? Do jeito que está:

Código: [Selecionar]
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:

Código: [Selecionar]
list = (V *)malloc(n * sizeof(V));
?