Isolei uma parte de um codigo de um trabalho, e explicando do inicio, basicamente, tenho duas struct que tem dois campos de pointers de tipos em comuns (tm *), e sendo assim, não queria ter que fazer duas funcoes pra limpar a memória desse campo delas, queria fazer somente uma, fiz um algoritmo com a ideia de utilizar o cast para converter um ponteiro generico para o tipo da struct necessária e só depois limpar os campos, mas não funcionou, por curiosidade testei o mesmo codigo com um ponteiro sem ser da time.h, e deu certo, e se eu limpo até mesmo normalmente o tm *, tb da erro de execução, estou manipulando erroneamente a funcao localtime? Em depuracao mostra estar recebendo todos os valores da forma correta.
Edit: Só uma att, por localtime retornar um tm *, eu fiz dessa forma por imaginar que ele ja esta alocando um local na memória do tamanho de tm, e retorne somente seu endereco.
Codigo que não funciona:
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include <stdarg.h>
#include <time.h>
typedef struct lancamentoCaixa{
time_t codigoCompra;
int modoPagamento;
float valor;
float valorPago;
float troco;
struct tm*data;
}lancamentoCaixa;
typedef struct contaArec{
int codigoCliente;
time_t codigoCompra;
int modoPagamento;
int parcelas;
float valorParc;
float entrada;
struct tm*dataAluga;
}contaArec;
void limpaData(int escolha, int quantidadeLanc, void *endereco){
for(int i = 0; i<quantidadeLanc; i++){
switch(escolha){
case 1:
free(((lancamentoCaixa *)endereco)[i].data);
((lancamentoCaixa *)endereco)[i].data = NULL;
break;
case 2:
free(((contaArec *)endereco)[i].dataAluga);
((contaArec *)endereco)[i].dataAluga = NULL;
break;
}
}
}
int main(){
time_t seg;
time(&seg);
contaArec teste;
lancamentoCaixa teste2;
teste.dataAluga = localtime(&seg);
teste2.data = localtime(&seg);
//free(teste2.data); //caso descomentar essa linha, o erro começa a acontecer aqui
limpaData(1, 1, &teste2);
}
Codigo que funciona:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include <stdarg.h>
#include <time.h>
typedef struct teste{
char *nome;
}teste;
typedef struct testeee2{
char *nome;
}testeee2;
int digText(FILE *f, char **text){
int indice = 0;
text[0] = malloc(sizeof(char));
do{
text[0][indice] = fgetc(f);
if(text[0][indice]!='\n'){
text[0] = realloc(text[0], sizeof(char)*(indice+1));
}
indice++;
}while(text[0][indice-1] != '\n');
text[0][indice-1] = '\0';
return indice+1;
}
void limpaNome(int escolha, int quantidade, void *end){
/*funcao recebe um endereco de uma struct teste ou testeeee2 por meio de um ponteiro generico, e converte ele pra forma adequada
através do primeiro argumento da funcao, limpando assim adequadamente*/
for(int i = 0; i<quantidade; i++){
switch(escolha){
case 1:
free(((teste *)end)[i].nome);
((teste *)end)[i].nome = NULL;
break;
case 2:
free(((testeee2 *)end)[i].nome);
((testeee2 *)end)[i].nome = NULL;
break;
}
}
}
int main(){
teste agora;
testeee2 agoraggg;
digText(stdin, &agora.nome);
digText(stdin, &agoraggg.nome);
printf("%s\n%s\n", agora.nome, agoraggg.nome);
limpaNome(1, 1, &agora);
}