Falha de Segmentação

1. Falha de Segmentação

Marcelo
marcelobg

(usa RedHat)

Enviado em 29/08/2006 - 09:51h

Olá a todos!!

estou com um problema que não estou entendendo o q pode ser. O meu programa compila normalmente, mas tá dando Falha de Segmentação na execução. Pelo que pode descobrir, acho que a falha tá ocorrendo na alocação de variáveis de uma função que eu chamo recursivamente. Quando eu coloco a declaração das variáveis no início da função o erro ocorre na segunda chamada recursiva dessa função (qdo ela é chamada de dentro dela mesma pela 1a vez). Mas qdo eu declaro algumas das variáveis dentro de um bloco if dentro da função o erro aparece nesse bloco, mas só depois de algumas chamadas recursivas da função.

Desculpem se ficou um pouco confuso, mas agradeço qq ajuda.


  


2. Re: Falha de Segmentação

Paulo André Capellari
tilibra_cc

(usa Debian)

Enviado em 29/08/2006 - 18:03h

Olha só, fica mais fácil se vc postar o código que está dando erro ;)


3. Re: Falha de Segmentação

Felipe Abella
FelipeAbella

(usa Debian)

Enviado em 29/08/2006 - 21:24h

Talvez um erro de estouro de pilha ou algo parecido, má uso de ponteiros, e talvez uma falta de checagem para terminar a recursividade...

Posta ai o código que eu testo aqui.


4. Re: Falha de Segmentação

Marcelo
marcelobg

(usa RedHat)

Enviado em 30/08/2006 - 09:37h

Obrigado pelas ajudas...

Na verdade o programa é bem complexo e grande, faz parte de uma tese de mestrado.

Há sim uma condição que termina a recursividade, porém é necessário um nível elevado de aninhamento, a função chama a si mesma 18 vezes até retornar. Talvez seja problema de estouro de pilha, mas qual é o limite de tamanho da pilha? eu monitoro o programa com o top, que diz que é usada até 4,4% da memória da máquina, não sei se isso exclui o estouro da pilha...

O código é assim:

float func(...)
{
declaracao de variaveis

comandos

if (condicao)
{
declaracao de variaveis

comandos
}
else
{
declaracao de variaveis

comandos
}

}


o erro dá logo depois do último comando antes do if e antes do primeiro comando dentro do if (ou do else, dependendo da condicao).

Valeu pela ajuda,
Marcelo



5. Re: Falha de Segmentação

Marcelo
marcelobg

(usa RedHat)

Enviado em 30/08/2006 - 09:39h

Esqueci de dizer q eh dentro do if e do else que eh chamada novamente a função func().


6. Re: Falha de Segmentação

Filipe Niero Felisbino
filipe

(usa Suse)

Enviado em 30/08/2006 - 10:03h

A pilha pode estourar mesmo que pouca memória esteja usando.

Porém, não acredito que seja este o seu caso, visto que são apenas 18 chamadas recursivas, já vi vários programas meus com uma pilha muito maior que 18.

Mas notei que você não tem certeza se realmente são 18 ou mais chamadas, porque você não adiciona um argumento na chamada desta função indicando quantas vezes ela foi chamada ( pode também ser uma variável statica ).

Por exemplo:

int funcaoRecursiva(int valor) {
printf("Função recursiva: %d\n", valor);
if (valor < 18)
funcaoRecursiva(++valor);
}

int main(int argc, char** argv) {
funcaoRecursiva(0);
}

Claro que isto não faz nada além de executar a função 18 vezes, mas pelo menos serve como meio de depuração.

Já fica mais fácil de você saber se o problema está na pilha ou não.



7. Re: Falha de Segmentação

Marcelo
marcelobg

(usa RedHat)

Enviado em 30/08/2006 - 11:55h

Acho que realmente não eh a pilha não. São 18 ou 19 chamadas recursivas apenas. Qdo eu tiro as declarações de variáveis de dentro do bloco do if e do else e as coloco na parte de declaração de variáveis da função o erro aparece na 2a chamada recursiva, depois da linha anterior à chamada e antes da 1a linha de comandos da função.

Uma outra dúvida: o printf é confiável pra descubrir em que linha dá o erro. Eu tenho usado o printf e o getchar pra descubrir onde dá o erro...


8. listakpostal-27 programa em c

Jonny Ernani Maia
maia99

(usa Debian)

Enviado em 24/12/2011 - 21:50h


Senhores peço que me ajudem, pois o programa abaxo. É compilado pelo gcc e não dá erros. Mas na execução mostra um erro "falha de segmentação". Meus colegas por favor se voces puderem me ajudar eu agradeço. Preciso executar este programa, pois será um sucesso se eu conseguir. Veja eu chamo um arquivo dados.txt. Onde eu escrevo pelo programa todos os dados e preciso depois verificar se os daos estarão neste arquivo txt.

Muito Obrigado.

Jonny Maia.





#include <stdio.h>

#include <stdlib.h>



#define MAX 100



struct addr{

char name[30];

char street[40];

char city[20];

char state[3];

unsigned long int zip;

} *addr_info;



int init_list(void);

int enter(void);

int delete(void);

int list(void);

int menu_select(void);

int find_free(void);



int main(void)

{



inicia();

printf("Legal heim\n\n\n");

system("color 2e");

char choice;

int init_list();// Iniciliaza a matriz de estruturas

for(;;) {

choice=menu_select();

switch(choice) {

case 1: enter();

break;

case 2: delete();

break;

case 3: list();

break;

case 4: exit(0);

case 5: salva();

}

}

}

//Inicializa a lista

int init_list(void)

{

register int t;

for(t=0; t<MAX; t++)

addr_info[t].name[0] = '{TTEXTO}';

}

//Otem a seleção

int menu_select(void)

{

char s[80];

int c;

printf("1. Inserir um nome\n\n");

printf("2. Excluir um nome \n\n");

printf("3. Listar o arquivo \n\n");

printf("4. Sair\n\n");

printf("5. Salvar Registros\n\n");

do{

printf("Digite sua escolha:____");

scanf("%c",(s));

c = atoi(s);

}while(c<0 || c>5);

return c;

}

//Insere os endereços na lista.

int enter(void)

{

int slot;

char s[80];

slot = find_free();

if(slot==-1) {

printf("Lista cheia\n\n");

return;

}

printf("Digite o nome: \n\n");

scanf("%c",(addr_info[slot].name));

printf("Digite a rua: \n\n");

scanf("%c",(addr_info[slot].street));

printf("Digite a cidade: \n\n");

scanf("%c",(addr_info[slot].city));

printf("Digite o Estado: \n\n");

scanf("%c",(addr_info[slot].state));

printf("Digite o CEP: \n\n");

scanf("%c",(s));

addr_info[slot].zip = strtoul(s, '{TTEXTO}', 10);

}

//Encontra um estrutura não usada

int find_free(void)

{

register int t;

for(t=0;addr_info[t].name[0] && t<MAX; t++)

if(t==MAX) return -1; //nenyhum elemento livre

return t;

}





/* int procura(char nome[])

{

register int t;

for(t=0; t < MAX; t++){

if(strcmp(nome, addr_info.name[t])

return t;

}

return -1;

} */





//Apaga um endereço

int delete(void)

{

register int slot;

char s[80];

printf(" Digite o registro #:\\n\n");

slot = atoi(s);

if(slot>=0 && slot < MAX)

addr_info[slot].name[0]= '{TTEXTO}';

}

//Mostra lista na tela

int list(void)

{

register int t;

for(t=0; t<MAX; ++t){

if(addr_info[t].name[0]){

printf("---------------------------------\n");

printf("%s \n\n\n", addr_info[t].name);

printf("%s \n\n\n", addr_info[t].street);

printf("%s \n\n\n", addr_info[t].city);

printf("%s\n\n\n", addr_info[t].state);

printf("%lu\n\n\n", addr_info[t].zip);



system("sleep 4");

}



}

printf("\n\n");



}



int salva(void){

FILE *dadosHd;



dadosHd = fopen("dados.dat", "r+");



fwrite(addr_info, sizeof(struct addr), MAX, dadosHd);



fclose(dadosHd);



return 0;

}



int inicia(void){

FILE *dadosHd;



dadosHd = fopen("dados.dat", "r+");

addr_info = malloc(sizeof(struct addr) * MAX);

fread(addr_info, sizeof(struct addr), MAX, dadosHd);

printf("%d ------------------<\n", sizeof(struct addr));

printf("nome - %s\n", addr_info[0].name);



fclose(dadosHd);



return 0;

}






























9. Re: Falha de Segmentação

Rafael Nelson Ceresoli
Rafael Ceresoli

(usa Ubuntu)

Enviado em 26/12/2011 - 11:14h

pode ser qualquer coisa






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts