Ir para conteúdo
Fórum Script Brasil
  • 0

Alocação Dinâmica (Realloc) | Vetor | For


renan_j

Pergunta

Boa tarde, pessoal!

 

Já li diversas coisas a respeito de Alocação Dinâmica com realloc e mesmo assim não consigo entender o porque meu código não estar dando certo. O meu objetivo fazer uma alocação dinâmica de um vetor com a relloc. Eu aloquei ele no inicio do código e a medida que preciso de mais espaço usei um laço (FOR) para ir alocando cada bloco.

O programa é o seguinte: "Leia um número positivo do usuário, então, calcule e imprima a sequencia de Fibonacci até o primeiro número superior lido. Exemplo: se o usuário informou o número 30, a sequência a ser impressa será 0 0 1 2 3 4 8 13 21 34.

 

O meu código funciona com números menores. Por exemplo, quando digito "10", ele vai até o 13. Tudo Ok.

MacBook-Pro-de-Renan:Lista_3 renan$ ./PD_L_3_44.out

Digite o n: 10

0, 1,

1,2,3,5,8,13,

 

 

Mas quando digito "30", ele quebra com a seguinte mensagem: 

 

MacBook-Pro-de-Renan:Lista_3 renan$ ./PD_L_3_44.out

Digite o n: 30

0, 1,

PD_L_3_44.out(2696,0x7fff782be000) malloc: *** error for object 0x7fbada401390: pointer being realloc'd was not allocated

*** set a breakpoint in malloc_error_break to debug

1,2,3,5,8,13,21,Abort trap: 6

 

Alguém consegue me ajudar o porque dá esse problema?

 

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

int main () {


	int *temp, n;

	int	*v = malloc(2 * sizeof(int));
	v[0] = 0;
	v[1] = 1;

	printf("Digite o n: ");
	scanf("%d", &n);

	printf("%d, %d,", v[0], v[1]);
	

	for(int i = 2; i > 1; i++){

		temp = realloc(v, (i+1) * sizeof(int));
		
		if( temp != NULL){

			v[i] = (v[i-1] + v[i-2]);
			printf("%d,", v[i]);
			
			if(v[i] >= n){
				i = 0;
			}
		} 

		else {
			printf("Erro na Alocação da Memória\n");
			return 1;
		}
	}

	free(v);
	printf("\n");
	return 0;

}

 

Muito obrigado!!

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

malloc e realloc retornam um ponteiro a void*, isso quer dizer que se nós buscamos lá onde estiverem declaradas essas duas funções vamos ver que elas estão declaradas como void* malloc(....){..., o mesmo acontece com realloc, void* malloc(....){... . Um ponteiro a void(void*) é um ponteiro genérico, ou seja, essas funções nunca sabem que tipo de ponteiro devem retornar pois são muitos tipos diferentes, então a solução é que ela devolve um ponteiro generico void* ao que posteriormente devemos castear(converter) ao tipo que em questão, o nosso tipo, nesse caso int*, muitas pessoas usam (int), isso esta errado, é (int*) pois se deve converter de void* que é um ponteiro a void a outro ponteiro que é int*(mesmo do tipo da sua variável), isso só funciona porque int e int* ocupam o mesmo espaço, mas é errado.

Então prove substituir as seguintes linhas por suas versões corretas:
substituir :int *v = malloc ( 2 * sizeof ( int ) ); por int *v = (int*)malloc ( 2 * sizeof ( int ) );
e substituir temp = realloc ( v, ( i + 1 ) * sizeof ( int ) ); por temp = (int*)realloc ( v, ( i + 1 ) * sizeof ( int ) );

Com isso seu programa deveria funcionar, me funcionou corretamente ou isso acho. >_<

Link para o comentário
Compartilhar em outros sites

  • 0
Em 11 de fevereiro de 2016 at 06:07, vangodp disse:

malloc e realloc retornam um ponteiro a void*, isso quer dizer que se nós buscamos lá onde estiverem declaradas essas duas funções vamos ver que elas estão declaradas como void* malloc(....){..., o mesmo acontece com realloc, void* malloc(....){... . Um ponteiro a void(void*) é um ponteiro genérico, ou seja, essas funções nunca sabem que tipo de ponteiro devem retornar pois são muitos tipos diferentes, então a solução é que ela devolve um ponteiro generico void* ao que posteriormente devemos castear(converter) ao tipo que em questão, o nosso tipo, nesse caso int*, muitas pessoas usam (int), isso esta errado, é (int*) pois se deve converter de void* que é um ponteiro a void a outro ponteiro que é int*(mesmo do tipo da sua variável), isso só funciona porque int e int* ocupam o mesmo espaço, mas é errado.

Então prove substituir as seguintes linhas por suas versões corretas:
substituir :int *v = malloc ( 2 * sizeof ( int ) ); por int *v = (int*)malloc ( 2 * sizeof ( int ) );
e substituir temp = realloc ( v, ( i + 1 ) * sizeof ( int ) ); por temp = (int*)realloc ( v, ( i + 1 ) * sizeof ( int ) );

Com isso seu programa deveria funcionar, me funcionou corretamente ou isso acho. >_<

Obrigado pela resposta, Vangop.

 

Na verdade, eu achei que os copiadores atualmente não exigiam o cast, mas sempre o farei a partir de agora.

 

Infelizmente, mesmo fazendo o cast, ainda não deu certo. O que mais pode ser? Obrigado!!

 

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

int main () {


	int *temp, n;

	int	*v = (int*)malloc(2 * sizeof(int));
	v[0] = 0;
	v[1] = 1;

	printf("Digite o n: ");
	scanf("%d", &n);

	printf("%d, %d,", v[0], v[1]);
	

	for(int i = 2; i > 1; i++){

		temp = (int*) realloc(v, (i+1) * sizeof(int));
		
		if( temp != NULL){

			v[i] = (v[i-1] + v[i-2]);
			printf("%d,", v[i]);
			
			if(v[i] >= n){
				i = 0;
			}
		} 

		else {
			printf("Error allocating memory\n");
			
			return 1;
		}
	}

	

	printf("\n");
	return 0;

}

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...