Ir ao conteúdo
  • Cadastre-se

C Erro ao usar realocar memória para vetor


Danie1 Net0
Ir à solução Resolvido por allanxd,

Posts recomendados

Desenvolvi um algoritmo utilizando alocação dinâmica de memória, que segue em sequência, para o seguinte exercício:

 

Citação

Escreva um programa que solicite a digitação de no máximo 10 números, representando valores de 0 a 100. Valores fora desta faixa não são aceitos e o valor -1 encerra digitação, caso o usuário pretenda digitar menos que 10 números. Contudo, se ele digitar 10 números o programa deixa de solicitar novos números. Digitando 10 números ou não, o programa deve mostrar quantos números foram informados, quais são o pares e quais são os ímpares.

 

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

int main(){
	int numero, c = 0, *num_pares, *num_impares, c_par = 0, c_impar = 0;
	
	num_pares = malloc(sizeof(int));
	num_impares = malloc(sizeof(int));
	
	do{
		printf("Insira um número inteiro: ");
		scanf("%d", &numero);
		
		if(numero != -1){
			if(numero >= 0 && numero <= 100){
				if(numero % 2 == 0){
					num_pares = realloc(num_pares, sizeof(int));
					
					if(num_pares != NULL){
						num_pares[c_par] = numero;
					}else{
						printf("Memória insuficiente!\n");
						exit(1);
					}
					
					c_par++;
				}else{
					num_impares = realloc(num_impares, sizeof(int));
					
					if(num_impares != NULL){
						num_impares[c_impar] = numero;
					}else{
						printf("Memória insuficiente!\n");
						exit(1);
					}
					
					c_impar++;
				}
				
				c++;
			}else{
				printf("    Número fora do intervalo permitido [0-100], tente novamente.\n");
			}
		}
	}while(c < 10 && numero != -1);
	
	printf("\nForam digitados %d números\n\n", c);
	
	printf("Números pares: ");
	if(c_par != 0){
		for(int i = 0; i < c_par; i++){
			printf("%d ", num_pares[i]);
		}
	}else{
		printf("nenhum número par\n");
	}
	
	printf("\nNúmeros ímpares: ");
	if(c_par != 0){
		for(int i = 0; i < c_impar; i++){
			printf("%d ", num_impares[i]);
		}
	}else{
		printf("nenhum número ímpar\n");
	}
	
	free(num_pares);
	free(num_impares);
	
	return 0;
}

Mesclando a entrada com números pares e ímpares o algoritmo funciona perfeitamente, porém se  a entrada for somente de números pares ou ímpares a execução é interrompida retornando o erro que segue na captura de tela. O que ocasiona esse erro e, consequentemente, como solucioná-lo? 

Erro.png

Link para o comentário
Compartilhar em outros sites

  • Solução
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
    int numero, c = 0, *num_pares = NULL, *num_impares = NULL, c_par = 0, c_impar = 0;

	num_pares = (int*)malloc(sizeof(int));
	num_impares = (int*)malloc(sizeof(int));

	do{
		printf("Insira um numero inteiro: ");
		scanf("%d", &numero);
		c++;

		if(numero != -1){
			if(numero >= 0 && numero <= 100){
				if(numero % 2 == 0){
					num_pares = (int*)realloc(num_pares, c * sizeof(int));

					if(num_pares != NULL){
						num_pares[c_par] = numero;
					}else{
						printf("Memoria insuficiente!\n");
						exit(1);
					}

					c_par++;
				}else{
					num_impares = (int*)realloc(num_impares, c * sizeof(int));

					if(num_impares != NULL){
						num_impares[c_impar] = numero;
					}else{
						printf("Memoria insuficiente!\n");
						exit(1);
					}

					c_impar++;
				}


			}else{
				printf("Numero fora do intervalo permitido [0-100], tente novamente.\n");
			}
		}
	}while(c < 10 && numero != -1);

	printf("\nForam digitados %d numeros\n\n", c);

	printf("Numeros pares: ");
	if(c_par != 0){
		for(int i = 0; i < c_par; i++){
			printf("%d ", num_pares[i]);
		}
	}else{
		printf("nenhum numero par\n");
	}

	printf("\nNumeros impares: ");
	if(c_impar != 0){
		for(int i = 0; i < c_impar; i++){
			printf("%d ", num_impares[i]);
		}
	}else{
		printf("nenhum numero impar\n");
	}

	free(num_pares);
	free(num_impares);
    return 0;
}

Funcionou?

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

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!