Alocação e Realocação de Memória em C [RESOLVIDO]

1. Alocação e Realocação de Memória em C [RESOLVIDO]

Jóvio
Jovioluiz

(usa Ubuntu)

Enviado em 24/03/2018 - 00:23h

Pessoal eu estou com um pouco de dificuldade para resolver este problema, sendo a descrição do problema é :
Escreva em programa em C que receba números inteiros do usuário indefinidamente. O programa finaliza quando o usuário entrar com o número 0.
a) Aloque, inicialmente, memória para 5 inteiros;
b) Caso o usuário entrar com mais inteiros, faça a realocação, alocando espaço para mais 5 inteiros e assim sucessivamente;
c) Quando o usuário digitar 0 devera imprimir os valores lidos, o índice e o endereço de memória.

O meu problema é que não estou conseguindo imprimir os valores lidos e eu digito alguns valores e da este erro "realloc(): invalid next size: 0x000055fc1e2ae260 ***".

O que eu posso mudar para ele funcionar?

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

int main(){

int j=5, *num, i=0, k=0;

num = (int *) malloc(5 * sizeof(int));

do {

printf("Digite um valor: ");
scanf("%d", (num+i));


if(k == j){

int *new = realloc(num, 5 * sizeof(int));

if(new){
num = new;
j += 5;
} else{
printf("Memória insuficiente\n");
}
}
k++;//incrementa k para comparar com j
i++;
//printf("Valor: %d\n", *num+i);

} while (*num+i !=0);

for(i = 0; i < k; i++){
printf("Valor: %d\n", *num+i);
printf("indice: %d\n", i);
printf("endereço de memória: %p\n", num+i);
}

free(num);

}



  


2. MELHOR RESPOSTA


oxidante

(usa Debian)

Enviado em 24/03/2018 - 02:37h

A causa do erro é que o programa está corrompendo o heap durante a leitura do sexto número pela função scanf(), antes da condição (k == j), e o valor é armazenado num espaço não alocado por vc. Outro problema é que é preciso passar múltiplos de 5 para a função realloc() para que a memória apontada por "num" acumule os novos valores. Também falta o uso de parenteses para obter o valor contido no endereço "num+i".


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

int main()
{
int j=5, *num, i=0, k=0;

num = (int *) malloc(j * sizeof(int));
do
{
if (i == j)
{
j += 5;
num = realloc(num, j * sizeof(int));
if (!num)
{
printf("Memória insuficiente\n");
break;
}
}

printf("Digite um valor: ");
scanf("%d", num+i);

k++; // k vai conter o número de elementos
i++;
} while (*(num+i-1) !=0);

for(i = 0; i < (k-1); i++)
{
printf("Valor: %d\n", *(num+i));
printf("indice: %d\n", i);
printf("endereço de memória: %p\n", num+i);
}
free(num);
return 0;
}


3. Re: Alocação e Realocação de Memória em C [RESOLVIDO]

Jóvio
Jovioluiz

(usa Ubuntu)

Enviado em 24/03/2018 - 09:24h

Valeu. Muito obrigado.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts