Ir para conteúdo
Fórum Script Brasil
  • 0

Segmentation fault (core dumped)


Rgss

Pergunta

Boa tarde pessoal, recentemente migrei para o ubunto 14.04LTS, e instalei o CodeBlocks para aproveitar meu tempo livre e programar um pouco, tive uma ideia de fazer um programinha de cadastramento de alunos, porém meu código quando chega em uma parte retorna um erro "Segmentation Fault(Core Dumped)", Esse problema está no meu código ou na própria IDE ? Quando passo o debugger me retorna o seguinte :
warning: GDB: Failed to set controlling terminal: Operação não permitida
E continua o programa, vou postar o código até a parte em que ocorre o bug.
 

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




#define SIZE 200

char nome[SIZE][50];
char nomeResponsavel[SIZE][50];
long long numeroTel[SIZE];
int cpf[SIZE];
int RA[SIZE];
int op;
void cadastro();
void pesquisar();

int main()
{
    cadastro();
    pesquisar();
}

void cadastro()
{
    static int linha;
    do{
        printf("\t\t\t\t\tCADASTRO DE NUMERO %d\n",linha);
        printf("Digite o nome do aluno : ");
        scanf("%[a-z A-Z]s",nome[linha]);
        setbuf(stdin, NULL);
        printf("Digite o nome do Respons%cvel : ",160);
        scanf("%[a-z A-Z]s",nomeResponsavel[linha]);
        setbuf(stdin, NULL);
        printf("Digite o Telefone: ");
        scanf("%lld",numeroTel[linha]); //Onde segundo o debugger ocorre o erro.
        setbuf(stdin, NULL); 
  

 

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

você declarou linha como uma variável estática inteira porem não deu valor, está tomando valor de lixo da memória. antes de guardar o telefone faça a prova, troque scanf("%lld",numeroTel[linha]) por printf("%d", linha) e veja que certamente linha é maior que 200 e por isso seu programa ta dando problema de segmento, porque você ta tentando acessar um casinha muito maior que 200 que foi o que você declarou.

Link para o comentário
Compartilhar em outros sites

  • 0

Ok... tinha passado por alto que static se inicializa automaticamente.
você está usando windows certo?
O problema é que MinGW depende do runtime da msvcrt.dll(win32). Mesmo que o compilador GCC suporta C99-ismos long long, o runtime que está processando a sequência de formato não compreende o especificador de formato "%lld", você teria que usar "%I64d" para long long e "I64u" para long long unsigned.

troque:

scanf("%lld",numeroTel[linha]);

por

scanf("%I64d", &numeroTel[linha]);


Na realidade você deveria ler telefones com array de chars, igualmente números de documentos etc. O problema é que %I64d e %I64u não são suportados pelo padrão, você teria um programa que só funciona no windows, teria de se usar estratégias mais agressivas para poder fazer o código portável. Algo parecido a isso:
#ifdef win
#define
scanf ( "%I64d", &numeroTel[linha] );
#elif
scanf ( "%lld", &numeroTel[linha] );
#endif

Toda essa manobra seria a coisa de usar long long int para ler o telefone quando deveria ser usado arrays de chars. Pense que é mais fácil processar strings que long long int, se mais tarde necessitar aplicar cálculos você sempre pode converter de array a int a long ou o que quiser.

Em fim... boa sorte.

Link para o comentário
Compartilhar em outros sites

  • 0

Certo, na verdade estou usando o ubuntu, como mencionado lá em cima. E vou aproveitar para perguntar  porque nesse scanf usar o & ? Pensei que se usava normalmente em int, char, floats, Double, que não sejam vetores ou matrizes. Poderia me explicar ? Enfim, acho que esse erro ta relacionado ao meu ubuntu e o codeblocks.

Entendi sua dica sobre array de chars, vou usar mesmo, terá como colocar o "()" seja no DDD. 

 

Link para o comentário
Compartilhar em outros sites

  • 0

porque scanf quer saber a direção da variável e não o valor. Ou seja se você já estudou ponteiros você sabe que se passar por valor você passa uma copia, então se scanf guarda-se o valor guardaria em uma copia não na autentica variável. já se passamos a direção da variável original essa será modificada esteja onde estiver. E por se sua duvida é que com arrays é ou não obrigado a por, sim é obrigado. quando eu faço vetor[10] eu to entregando o valor da 10 casinha, se faço &vetor[10] eu to entregando a direção da décima casinha do vetor, e poderia ser modificada em qualquer parte do código incluindo outras funções, etc. Provavelmente só por por & seu problema se solucione, pois scanf esta esperando um inteiro sim, mas o inteiro que diga a direção de &numeroTel[linha] e você está indicando um valor numeroTel[linha], ele vai tomar esse valor como se fosse a direção e tantar por lá os dados causando violação de segmento, você esta saindo fora do segmento que lhe foi designado.

Outra coisa diferente são arrays de chars, nesse caso não é necessário por & adiante. Para ficar mais fácil decorar lembre que não deve se por & adiante de strings ou ponteiros no scanf.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...