Ir ao conteúdo
  • Cadastre-se

C segmentation fault ao alocar memória com malloc - C


Visitante
Ir à solução Resolvido por arfneto,

Posts recomendados

O codigo abaixo é apenas para fins de entendimento, não tem motivo para ele, apenas ajudar a esclarecer as duvidas sobre arquitetura de computadores.

 

Code:

 

#include <stdio.h>

#include <stdlib.h>



int main(void){

  int *p;

  int *o;

  int *p2;



  o = (int*) malloc(sizeof (int));

  //p2 = (int*) malloc(sizeof(int));



  *o = 50;

  *p = 50;



  return 0;

}

 

Se eu descomentar a parte do codigo que aloca espaço para p2, eu recebo o erro de "segmentation fault" não entendi o motivo de receber isso.

Link para o comentário
Compartilhar em outros sites

O motivo: você está usando duas linhas abaixo 
 

	*p = 50;

 

  • não foi essa a variável que alocou. Não sabe pra onde isso aponta.
  • de todo modo não mostrou os valores então não dá pra saber se está funcionando.
  • não deve deixar ponteiros não inicializados. Na verdade deve inicializar todas as variáveis.
  • sempre libere o que alocou. Nem todos seus programas vão ter 10 linhas e pode cancelar em um lugar totalmente inesperado e poe não ser fãcil achar um erro desses.

EXEMPLO

 

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

int main(void)
{
  	int*    o = (int*) malloc(sizeof(int));
	int*    p = (int*) malloc(sizeof(int));

	*o = 50;
	*p = 5050;
	printf("*o = %d, *p = %d (esperados 50 e 5050)\n", *o, *p);
	free(o);
	free(p);
	return 0;
}

 

que mostra
 

*o = 50, *p = 5050 (esperados 50 e 5050)

 

prefira sempre algo assim. Se possível use funções para retornar a área alocada e para liberar.

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Não consegui entender a primeira parte, eu não posso declarar "int *p;" e depois passar uma valor para o "*p"? Porque eu fiz exatamente isso com a variavel "P" e funcionou.

quando aloquei a memória no momento que declarei a p2 ele funcionou, porque com a variavel "O" não aconteceu a mesma coisa?

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, XPointersX disse:

Não consegui entender a primeira parte, eu não posso declarar "int *p;" e depois passar uma valor para o "*p"? Porque eu fiz exatamente isso com a variavel "P" e funcionou.


Pode. Apenas não deve. Nesse campo o que menos se quer é deixar pontas soltas. Se precisa mesmo declarar em separado escreva  o simples

 

	int*     o = NULL;

 

Nunca deixe um ponteiro uma linha sequer com um valor desconhecido. Você deixou para p. e aí foi escrever *p = 50 quando p não aponta pra nada e isso cancela seu programa, a menos que por acaso p aponte para algum endereço válido em seu programa. E nesse caso pode nunca saber o que houve...

 

E leia TODAS as mensagens de erro de seu compilador. E cuide delas.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Uma duvida minha, quando eu deixei o codigo desse modo, ainda tomei segmentation fault. 

#include <stdio.h>

#include <stdlib.h>



int main(void){

  int *p = NULL;

  //int *o;

  //int *p2;



  //o = (int*) malloc(sizeof (int));

  //p2 = (int*) malloc(sizeof(int));



  //*o = 50;

  *p = 50;



  return 0;

}

 

Link para o comentário
Compartilhar em outros sites

Acabei de tentar rodar esse codigo, e também recebi um segmentation fault.

#include <stdio.h>
#include <stdlib.h>
  
int main(void){
	
  	int *p = NULL;
  	int *p2 = NULL;
  	int *p1 = NULL;
  
  	p2 = (int*) malloc(sizeof(int));
  	
  	*p1 = 50;
  	*p2 = 50;;
  	*p = 50;
    
	 return 0;
}

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, XPointersX disse:

Acabei de tentar rodar esse codigo, e também recebi um segmentation fault.

#include <stdio.h>
#include <stdlib.h>
  
int main(void){
	
  	int *p = NULL;
  	int *p2 = NULL;
  	int *p1 = NULL;
  
  	p2 = (int*) malloc(sizeof(int));
  	
  	*p1 = 50;
  	*p2 = 50;;
  	*p = 50;
    
	 return 0;
}

p1 e p não estão referenciando nenhum endereço de memória que possa armazenar um int, já que você não alocou memória diretamente através de malloc para ser referenciado, nem atrituiu a elas o endereço de alguma variável int.

 

Um exemplo que deve facilitar o entendimento:

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

int main(void) {

    int *n1;
    int *n2 = NULL;

    int n3 = 300;
    int *n4;

    n1 = (int*) malloc(sizeof (int));
    n2 = (int*) malloc(sizeof (int));

    *n1 = 100;
    *n2 = 200;
    n4 = &n3;

    printf("%d\n", *n1);
    printf("%d\n", *n2);
    printf("%d\n", n3);
    printf("%d\n", *n4);
  
    return 0;
}

Você está recebendo Segmentation Fault porque está tentando tentando armazenar um valor sem ter alocado uma área de memória onde esse valor possa ser armazenado, deixar de inicializar ponteiros com NULL ou 0 não gera Segmentation Fault.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução

No tópico #2 eu já te disse o que estava errado. E como corrigir. E mostrei um exemplo.

 

Você continua com o mesmo programa e erro de antes, e o mesmo resultado de antes.

 

Rodou o programa que eu te mostrei? Entendeu a diferença? Porque não usou o exemplo para mudar seu código?

 

3 horas atrás, XPointersX disse:

Acabei de tentar rodar esse codigo, e também recebi um segmentation fault.

 

Sim, é igual ao outro.

 

3 horas atrás, XPointersX disse:
  	int *p = NULL;
  	int *p2 = NULL;
  	int *p1 = NULL;
  
  	p2 = (int*) malloc(sizeof(int));
  	
  	*p1 = 50;
  	*p2 = 50;;
  	*p = 50;
    

 

Você declarou 3 ponteiros. São como envelopes, prontos para ter algo dentro. Ao iniciar com NULL deixa claro que não apontam para nada.

 

Depois aloca uma área do tamanho de um int e coloca o endereço em p2. 

 

Nada faz em relação aos outros 2 ponteiros, e assim quando tenta atribuir um valor na área apontada por p1 seu programa cancela, já que p1 não aponta para nada

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!