Erro Falha de Segmentação (Imagem do Núcleo Gravada)

1. Erro Falha de Segmentação (Imagem do Núcleo Gravada)

Fabiel R. da Silva
tektron

(usa Outra)

Enviado em 09/07/2014 - 14:49h

void Ordenacao(){
// vetor de strings
char** nomes;

// de strings a serem comparadas
int qtd;

// contadores
int i,j;

struct pessoa umapessoa;

char* temp = (char*) malloc(40*sizeof(char));

nomes = (char**) malloc(qtd*sizeof(char*));

// posiciona o arquivo no inicio
fseek(arquivo,0,SEEK_SET);

i = 0;
qtd=0;
j = 0;

do{
// le de agenda.dat
fread(&umapessoa, sizeof(struct pessoa), 1, arquivo);
nomes[i] = (char*) malloc(40*sizeof(char));
nomes[i] = umapessoa.nome;
printf ("%d", qtd);
qtd++;
i++;
} while(!feof(arquivo));

// Rotina de ordenação
for(i = 1; i < qtd; i++) {
for (j = 0; j < qtd ; j++) {
if(strcmp(nomes[j],nomes[j+1]) > 0){
strcpy(temp,nomes[j]);
strcpy(nomes[j],nomes[j+1]);
strcpy(nomes[j+1],temp);
}
}
}

free(temp);

printf("Imprimindo os nomes ordenados\n");
for(i = 0; i < (qtd-1);++i) {
printf("%s\n",nomes[i]);
}

// liberando a memória alocada dinâmicamente
for(i = 0; i < qtd;++i) {
free(nomes[i]);
}

// liberando a memória alocada dinâmicamente
free(nomes);
}


O erro esta acontecendo na //Rotina de Ordenação, mas não sei qual o motivo.
Se alguem poder me ajudar, desde já agradeço.


  


2. Re: Erro Falha de Segmentação (Imagem do Núcleo Gravada)

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 09/07/2014 - 15:05h

Para saber qual é o erro compile com -g

Ex : gcc -o exemplo1 exemplo1.c -g

depois digite "gdb ./exemplo1" (sem aspas)

e depois "run" (sem aspas)

para amais detalhes vai nesse site:

http://pt.kioskea.net/faq/10323-linguagem-c-c-c-falha-de-segmentacao

Te +


3. Re: Erro Falha de Segmentação (Imagem do Núcleo Gravada)

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/07/2014 - 16:07h

Uma coisa que salta aos olhos é a alocação de nomes, pois a variável qtd, passada como fator no argumento de malloc(), não foi inicializada com um valor válido.

Outro problema é o bloco

nomes = (char*) malloc(40*sizeof(char));
nomes[i] = umapessoa.nome;


, no qual você aloca um ponteiro e logo em seguida descarta o ponteiro alocado, sobrescrevendo-o com o endereço fixo do elemento [i]nome
da variável umapessoa. Como esse endereço não foi alocado com malloc(), será um erro depois você tentar passá-lo como argumento para free().


4. Re: Erro Falha de Segmentação (Imagem do Núcleo Gravada)

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/07/2014 - 17:09h

Thihup escreveu:

Para saber qual é o erro compile com -g

Ex : gcc -o exemplo1 exemplo1.c -g

depois digite "gdb ./exemplo1" (sem aspas)

e depois "run" (sem aspas)

para amais detalhes vai nesse site:

http://pt.kioskea.net/faq/10323-linguagem-c-c-c-falha-de-segmentacao

Te +


Eu também sou fã do gdb, mas para que o uso dele seja eficaz, a pessoa precisa entender o que está fazendo. Como eu mostrei acima, o problema dele está na hora de alocar e desalocar os ponteiros, porque ele aloca um de maneira temerária e perde as referências aos demais ponteiros alocados.

Além do mais, você não sabe qual plataforma e qual compilador ele está usando. Se for Windows com VisualStudio ou mesmo MS-DOS com TurboC (que ainda aparece por aqui de vez em quando), pode ser que o gdb não seja uma opção.

O artigo que você indicou tem algumas imprecisões. Para começo de conversa, a tradução tem algumas coisas estranhas, como "desbloqueio" e smiliares, que, pelo contexto, devem ser do Inglês "debugging", logo, para nós brasileiros, melhor seria se tivesse sido traduzida como "depuração". Outra coisa esquisita é considerar que Perl ou Java são de alto nível, como se C e (principalmente) C++ não o fossem, pelo simples fato de as primeiras serem interpretadas e as últimas gerarem código nativo após a compilação, quando, na verdade, o que faz um linguagem ser de alto nível é a oferta de mecanismos de abstração ou de formas de criar tais mecanismos na hora de escrever código.

O linguajar usado na postagem parece fazer crer que a memória inválida para o programa poderia estar sendo usada por outro programa, como se a RAM fosse repartida entre todos os programas em execução. No entanto, para sistemas modernos (UNIX, Linux, Windows), toda a memória do programa é virtual, de modo que o endereço da RAM física ocupado pelo programa pode não ser -- e raramente é -- exatamente igual ao endereço indicado pelo ponteiro, uma vez que existe um remapeamento dos endereços virtuais em endereços reais de memória, o que permite a dois programas que coexistem na máquina ter ponteiros para regiões de memória só suas, mas com o mesmo valor de endereço. Além disso, faltou dizer que a falha de segmentação não acontece apenas quando um endereço inválido é usado, mas também pode ocorrer quando um a endereço válido é tentado acesso de tipo incorreto (por exemplo, quando se tenta escrever numa região de memória rotulada como sendo apenas para leitura).






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts