gRoOvE 0 Denunciar post Postado Março 15, 2009 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
_Isis_ 202 Denunciar post Postado Março 15, 2009 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
gRoOvE 0 Denunciar post Postado Março 15, 2009 Editei, veja novamente.. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 15, 2009 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
gRoOvE 0 Denunciar post Postado Março 16, 2009 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
_Isis_ 202 Denunciar post Postado Março 16, 2009 Instale o valgrind. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Março 16, 2009 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
_Isis_ 202 Denunciar post Postado Março 17, 2009 Valgrind. Compartilhar este post Link para o post Compartilhar em outros sites