Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gRoOvE

problemas com realloc...

Recommended Posts

Fiz esse códigozinho aqui só pra testar um realloc, mas não tá dando certo...to fazendo oq errado?

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10
typedef struct
{
	char *nome;
}Cadastro;

Cadastro *cadastro;

int main()
{
	char nomeTemp[255];
	int qtdCadastro = 0;
	int i = 0;

	if(!(cadastro = (Cadastro*)malloc(sizeof(Cadastro) * 3)))
		return(1);

	while(i<MAX)
	{
		printf("Digite um nome: ");
		fgets(nomeTemp,255,stdin);
		nomeTemp[strlen(nomeTemp) - 1] = '\0';
		cadastro[i].nome = (char*)malloc(sizeof(char) * (strlen(nomeTemp) - 1));
		strcpy(cadastro[i].nome, nomeTemp);
		
		qtdCadastro++;
		i++;
		if(qtdCadastro == 3)
		{
			if(!(cadastro = (Cadastro*)realloc(cadastro, sizeof(Cadastro) * i + 3)))
				return(1);
			qtdCadastro = 0;
		}
	}
	for(int j=0; j<MAX; j++)
	{
		printf("%s\n",cadastro[j].nome);
	}
	system("pause");
	return(0);
}

Erro besta...malz =((

if(!(cadastro = (Cadastro*)realloc(cadastro, (sizeof(Cadastro) * i) + (sizeof(Cadastro) * qtdCadastro))))
Tem como debugar ou de alguma outra forma saber se tá funcionando mesmo a alocação da memória?

 

E pra liberar a memória? Tem que liberar o ponteiro *nome tb né? Tava fzendo assim, mas tava dando erro, ai liberei soh a struct e foi de boa, é isso mesmo?

for(int j=0; j<MAX; j++)
	{
		free(cadastro[j].nome);
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites
realloc(): invalid next size: 0x0804b048

 

if(!(cadastro = (Cadastro*)realloc(cadastro, sizeof(Cadastro) * (i + 3))))

 

Saida:

 

cleverson@linux-5xjp:~/src> ./a.out

Digite um nome: qwe

Digite um nome: asd

Digite um nome: zxc

Digite um nome: cvb

Digite um nome: dfg

Digite um nome: ert

Digite um nome: 457uj

Digite um nome: vbnv

Digite um nome: ert53we

Digite um nome: aw23sedrftcg

qwe

asd

zxc

cvb

dfg

ert

457uj

vbnv

ert53we

aw23sedrftcg

sh: pause: command not found

Compartilhar este post


Link para o post
Compartilhar em outros sites

1- Propriedade distributiva da multiplicação: a*b+a*c = a*(b+c). Economize dedo.

 

2-

Tem como debugar ou de alguma outra forma saber se tá funcionando mesmo a alocação da memória?

 

A alocação funciona. Não funciona se você passar coisa errada p/ função. O realloc reserva uma área de memória em bytes, copia todos os elementos do primeiro argumento para a área reservada e libera a área anterior. Se o bagulho não cabe em 3 bytes, vai dar pau.

 

E pra liberar a memória? Tem que liberar o ponteiro *nome tb né? Tava fzendo assim, mas tava dando erro, ai liberei soh a struct e foi de boa, é isso mesmo?

 

 for(int j=0; j<MAX; j++)
{
	printf("%s\n",cadastro[j].nome);
free(cadastro[j].nome);
}

free(cadastro);

 

==11246== All heap blocks were freed -- no leaks are possible.

 

 

 

 for(int j=0; j<MAX; j++)
{
	printf("%s\n",cadastro[j].nome);
}

free(cadastro);

 

 

==11263== LEAK SUMMARY:

==11263== definitely lost: 31 bytes in 10 blocks.

==11263== possibly lost: 0 bytes in 0 blocks.

==11263== still reachable: 0 bytes in 0 blocks.

==11263== suppressed: 0 bytes in 0 blocks.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz exatamente assim o free() e esse meu compilador tá dizendo que tá errado...

 

HEAP[struct_dinamica.exe]: Heap block at 003329F0 modified at 003329FC past requested size of 4 Windows has triggered a breakpoint in struct_dinamica.exe.

 

Windows has triggered a breakpoint in struct_dinamica.exe.

This may be due to a corruption of the heap, which indicates a bug in struct_dinamica.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while struct_dinamica.exe has focus.

The output window may have more diagnostic information.

 

Tem algum lugar específico do debugger pra ver essas informações relacionadas a alocação da memória?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só roda no Linux =(( Mas você viu esse esquema da memória com ele ou com GCC?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.