Ir ao conteúdo
  • Cadastre-se

C Função Malloc ou Calloc, qual usar neste código?


ArieviloAgarf

Posts recomendados

Boa tarde Pessoal.

 

Gostaria de receber um feedback de vocês sobre onde posso estar errando. Sou nova na área e me falta muito conhecimento ainda.

O código possui três vetores, A, B, C. O terceiro vetor C irá receber o resultado dos dois anteriores A e B.

Na impressão do vetor resultante, devo excluir os valores repetidos e usar alocação dinâmica para imprimir o resultado, no entanto, usando a função malloc, imprime lixo de memória, se uso

a função calloc, ela inizializa com zero em todas as posições.

Vocês poderia me ajudar a resolver essa questão, por gentileza?

Muito obrigado!

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

int main(int argc, char **argv)
{
	//Declaração das variáveis e vetores
    int vetA[10], vetB[15], vetC[25];
    int mostra[25];
	int i, j, troca;
		

	//Função que mudará os valores em cada nova execução
	srand(time(NULL));
	//Vetor preenchido com valores de 0 até 100
	printf("Preenchendo o vetor A aleatoriamente\n\n");
	for (i=0; i<10; i++){
		vetA[i] = rand() % 100;
		printf("O valor gerado na posicao [%2d] eh = %d\n", i, vetA[i]);	
	}
	printf("\n");
	//Preenchendo o segundo vetor
	printf("Preenchendo o vetor B aleatoriamente\n\n");
	for (i=0; i<15; i++){
		vetB[i] =rand() % 100;
		printf("O valor gerado na posicao [%2d] eh = %d\n", i, vetB[i]);
    }
	printf("\n");
	
	//Laço que vai ler os valores gerados e atribuirá ao vetor C "Vetor Resultante"
	for (i=0; i < 10; i++){
		vetC[i] = vetA[i];
	}
	for (i=10; i<25; i++){
		vetC[i]= vetB[i-10];
	}

	//Ordenando os objetos dos vetores
	int escolhido;
	int tamanhoVetor = 25;
	for (i = 1; i < tamanhoVetor; i++) {
		escolhido = vetC[i];
		j = i - 1;
			
		while ((j >= 0) && (vetC[j] > escolhido)) {
			vetC[j + 1] = vetC[j];
			j--;
		}	
		vetC[j + 1] = escolhido;
	}
	//Imprime os elementos do vetor C de forma ordenada
	printf("O vetor C ordenado possui os seguintes elementos\n\n");
		for(i=0; i<25; i++){
			printf("%2d\n", vetC[i]);
		
		}
	
		printf("\n");
		
    //Laço que vai controlar e eliminar os valores repetidos
    for(i = 0; i < 25; i++)
    {
        for(j = 0; j < troca; j++)
        {
            if( vetC[i] == mostra[j])
                break;
        }

        if( j == troca)
        {
            mostra[troca] = vetC[i];
            troca++;
        }
    }

    //Impressão do vetor Resultante excluído os valores redundantes Gerado Dinamicamente
    printf("Imprime vetor resultante excluídos os valores repetidos = C\n\n");
    int *p;
	p = (int *) calloc(25,sizeof(int));
	
	for( i = 0; i < troca; i++ )
    printf("O elemento na [%d] posicao = %d \n", i, p[i]);
    system("pause");
		
	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

você tem que preencher o "p" com os valores antes de imprimir:

//(...)
int i, j, troca = 0;//não esquecer de inicializar "troca"
//(...)
int *p; 
p = (int *) malloc(troca*sizeof(int)); 
memcpy (p, mostra, troca*sizeof(int));//copia o conteúdo de mostra em p
for(i = 0; i < troca; i++ ) 
{
 
  printf("O elemento na [%d] posicao = %d \n", i, p[i]);
}
                     
free(p);//tem que liberar a memória alocada antes de sair

Acho que assim vai funcionar (não testei).

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

@Flávio Pedroza Olá. Boa resposta!

Só uma dica: Para a função malloc não é preciso o uso da casting explícito. Além de desnecessário pode te induzir ao erro!

Seria isso:

p = malloc(troca * sizeof(int)); // aqui ocorre uma casting implícito para o tipo do ponteiro, que é int *

Só uma dica, ok cara?

Abraço! 🙂

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