Ir ao conteúdo

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


Ir à solução Resolvido por LMolinari,

Posts recomendados

Postado

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
  • Membro VIP
  • Solução
Postado
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
Postado

@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
Postado
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

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!