Jump to content
Fórum Script Brasil
  • 0

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


renan_j
 Share

Question

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 to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...