Ir ao conteúdo
  • Cadastre-se

C Função malloc não está funcionando como deveria (C)


Pedroernesto64
Ir à solução Resolvido por LMolinari,

Posts recomendados

Estou tentando fazer um programa básico de pilhas em C, usando alocação dinâmica. Ele compila, e eu dou as seguintes entradas:

7 (tamanho da pilha)

1 (opção push)

3 (valor que quero inserir na pilha)

Após isso, ele me retorna "zsh: segmentation fault (core dumped)", indicando que falta memória para a operação. Achei que a linha "pilha=(int *) malloc (n * sizeof(int))" já daria conta disso. O que estou fazendo errado?

Obs: Estou compilando usando gcc num PC com Manjaro.

 

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

void TPilha_Atual (int *pilha, int topo) { //Imprime todos os elementos da pilha
	int i;
	printf ("Pilha atual: ");
	for (i=1; i<=topo; i++) {
		printf ("%d ", pilha[i]);
	}
	printf ("\n");
}

int TPilha_EhVazia (int topo) { //Verifica se a pilha está vazia
	if (topo==0) {
		printf ("A pilha está vazia\n");
		return 1;
	}
	else {
		return 0;
	}
}

int TPilha_EhCheia (int max, int topo) { //Verifica se a pilha está cheia
	if (topo==max) { 
		printf ("A pilha está cheia\n");
		return 1;
	}
	else {
		return 0;
	}
}

void TPilha_Empilha (int *pilha, int insere, int topo) { //Insere um elemento, e depois imprime a pilha
	pilha[topo+1]=insere;
	TPilha_Atual(pilha, topo);
}

//---------------------------------

int main () {
	int *pilha;
	int n, opcao, insere, topo=0;
	
	printf ("Digite o tamanho da pilha: ");
	scanf ("%d", &n);
	printf ("\n");
	pilha=(int *) malloc (n * sizeof(int)); //Inicia a pilha com o tamanho desejado
	while (opcao!=4) {
		printf ("Escolha uma operação (1-push / 2-pop / 3-top / 4-fim): ");
		scanf ("%d", &opcao);
		switch (opcao) {
			case 1: //Caso "Push" (insere um item)
				if (TPilha_EhCheia(n, topo)==0) { //Verifica se um elemento pode ser adicionado
					printf ("Digite o número desejado: ");
					scanf ("%d", insere);
					printf ("\n");
					TPilha_Empilha(pilha, insere, topo);
					topo++;
				}
				break;
			case 2: //Caso "Pop" (retira o último item)
				if (TPilha_EhVazia(topo)==0) { //Verifica se um elemento pode ser retirado
					topo--; //Diminui o índice do topo, ignorando o valor posterior
					TPilha_Atual(pilha, topo);
				}
				break;
			case 3: //Caso "Top" (verifica o valor do último item)
				if (TPilha_EhVazia(topo)==0) {
					printf ("%d", pilha[topo]);
				}
				break;
		}
	}
	
	return 0;
}

 

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

  • Membro VIP
  • Solução
case 1: //Caso "Push" (insere um item)
				if (TPilha_EhCheia(n, topo)==0) { //Verifica se um elemento pode ser adicionado
					printf ("Digite o número desejado: ");
					scanf ("%d", insere);

 

mude a última linha para:

 

					scanf ("%d", &insere);

 

Você definiu insere como um int, porém o que scanf espera receber é um ponteiro para um int.

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

@Pedroernesto64    isso mesmo que o @LMolinari    disse , e também na função empilha precisa enviar a posição atual certa do vetor onde armazenou o valor , que é em topo + 1 , 

void TPilha_Empilha(int* pilha, int insere, int topo)  //Insere um elemento, e depois imprime a pilha
{
    pilha[topo + 1] = insere;
	TPilha_Atual(pilha, topo + 1);
}

 

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

21 horas atrás, LMolinari disse:
case 1: //Caso "Push" (insere um item)
				if (TPilha_EhCheia(n, topo)==0) { //Verifica se um elemento pode ser adicionado
					printf ("Digite o número desejado: ");
					scanf ("%d", insere);

 

mude a última linha para:

 

					scanf ("%d", &insere);

 

Você definiu insere como um int, porém o que scanf espera receber é um ponteiro para um int.

 

Um detalhezinho que a gente esquece, e já quebra tudo kk. Muito obrigado!

17 horas atrás, devair1010 disse:

@Pedroernesto64    isso mesmo que o @LMolinari    disse , e também na função empilha precisa enviar a posição atual certa do vetor onde armazenou o valor , que é em topo + 1 , 

void TPilha_Empilha(int* pilha, int insere, int topo)  //Insere um elemento, e depois imprime a pilha
{
    pilha[topo + 1] = insere;
	TPilha_Atual(pilha, topo + 1);
}

 

 

Isso também foi essencial. Valeu!

  • 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!