|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2008
Città: mondovi
Messaggi: 1491
|
[ansi C ]Free sbagliata?
Ragazzi ho un problema con le free del C...mi sto esercitando su dei prog, il programma l'ho terminato ma la free mi pianta tutto!
Qui sotto sono postati i prototopi di funzioni delle funzuioni più prototipo e funzione che mi liberano la memoria ma mi piantano il prog, più tutto il main e le 2 struttura di struttura dinamica! Codice:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Msize 100+1
#define InDATA 10+1
#define RedF 32+1
#define Debug 1
typedef struct historyOp{
int posME;
float mov;
char data[Msize];
}opzn;
typedef struct Database_conti{
char Id[Msize];
float money;
float Rmoney;
char n[Msize];
char c[Msize];
int nOprzn;
opzn *str2;
}conti;
conti* Alloco(conti *,int,int);
void BildDB(conti *,int,FILE *);
void BildDataBase(conti * ,FILE *,int,int);
void debug(conti *, int);
void IdHistory(conti *,FILE *fin,int,int);
void freeMalloc(conti *,int);
void IdOpe(conti*,char *,int,int);
void negativi(conti*,int,int);
int main(int argc, char * argv[]){
conti *str1;
str1==NULL;
FILE *fin1,*fin2;
char nfile[RedF];
char scelta[InDATA];
int n,freMemON,netx;
freMemON=0;
netx=0;
if(argc!=2){
fprintf(stderr,"ERROR!: missing parametries");
exit(EXIT_FAILURE);
}
if((fin1=fopen(argv[1],"r"))==NULL){
fprintf(stderr,"\nERROR!: I can't open your file %s ",argv[2]);
exit(EXIT_FAILURE);
}
fscanf(fin1,"%d",&n);
if(Debug==1)
printf("\n |>\n");
str1=Alloco(str1,n,Debug);
if(Debug==1)
fprintf(stdout,"\ndebug info: Malloc ok! |>");
BildDataBase(str1,fin1,n,Debug);
if(Debug==1)
fprintf(stdout,"\ndebug info: Base dati creata; ho teminato di acquisire i numeri di conto!!");
fclose(fin1);
while(strcmp(scelta,"T")!=0){
printf("\ncome procedere? I <nomefile.txt> | R | V <idconto> | T \n");
scanf("%s",scelta);
if(Debug==1)
fprintf(stdout,"\ndebug info: letto scelta [%s] |>",scelta);
if(strcmp(scelta,"I")==0){
if(freMemON==1)
freeMalloc(str1,n);
scanf("%s",nfile);
if(Debug==1)
fprintf(stdout,"\ndebug info: apri il file [%s]: ",nfile);
if((fin2=fopen(nfile,"r"))==NULL){
fprintf(stderr,"\nERROR!: I can't open your file %s ",nfile);
exit(EXIT_FAILURE);
}
IdHistory(str1,fin2,Debug,n);
debug(str1,n);
freMemON=1;
netx=1;
fclose(fin2);
}
if(strcmp(scelta,"R")==0){
if(freMemON==0)
printf("\nPRIMA CARICARE LE OPERAZIONI!");
if(Debug==1)
fprintf(stdout,"\ndebug info: caso R! NEXT:%d ",netx);
if(netx==1){
printf("\n|>");
negativi(str1,n,Debug);
}
}
if(strcmp(scelta,"V")==0){
if(freMemON==0)
printf("\nPRIMA CARICARE LE OPERAZIONI!");
if(Debug==1)
fprintf(stdout,"\n\n\ndebug info: caso V! NEXT:%d ",netx);
if(netx==1){
scanf("%s",nfile);
if(Debug==1)
fprintf(stdout,"\ndebug info: Ti passo il conto: %s |>",nfile);
IdOpe(str1,nfile,n,Debug);
}
}
}
if(Debug==1)
printf("\n Programma terminato!! by by\n");
if(freMemON==1)
freeMalloc(str1,n);
return 0;
}
conti* Alloco(conti * str1,int dim,int db){
void debug(conti * str1, int dim){
void debug(conti * str1, int dim){
void IdHistory(conti *str1, FILE *fin, int db, int dim){
void freeMalloc(conti *str1,int dim){
int i,j;
printf("\nWelcome to FREEMalloc");
for(i=0; i<dim; i++){
for(j=0;j<str1[i].nOprzn;j++)
(str1[i].str2);
free(str1);
}
}
void IdOpe(conti* str1,char * IDC,int dim,int db){
void negativi(conti *str1,int dim,int db){
In compilazione codebolcks non mi restituisce ne errors ne warnig.... Non so davvero come modifcare il codice cosa potrei fare? Ripeto il tutto è ma la free si pianta! la sicurezza mi è data dal fatto ke programmando sotto linux e il messaggio è ben chiaro! ecco cosa ottengo dall'output del terminale. In'oltre rendendo commento le chiamate il prog va... Codice:
debug info: letto scelta [i] |> *** glibc detected *** ./1: double free or corruption (!prev): 0x08bbe170 *** ======= Backtrace: ========= /lib/i686/cmov/libc.so.6[0xb7da38f4] /lib/i686/cmov/libc.so.6(cfree+0x96)[0xb7da5896] ./1[0x8049056] ./1[0x8048901] /lib/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7d4b7a5] ./1[0x8048691] ======= Memory map: ======== 08048000-0804a000 r-xp 00000000 08:01 17154 /home/giuse/windowsHD/tlpes/ex/1 0804a000-0804b000 rw-p 00001000 08:01 17154 /home/giuse/windowsHD/tlpes/ex/1 08bbe000-08bdf000 rw-p 00000000 00:00 0 [heap] b7c00000-b7c21000 rw-p 00000000 00:00 0 b7c21000-b7d00000 ---p 00000000 00:00 0 b7d34000-b7d35000 rw-p 00000000 00:00 0 b7d35000-b7e8d000 r-xp 00000000 08:03 129803 /lib/i686/cmov/libc-2.9.so b7e8d000-b7e8e000 ---p 00158000 08:03 129803 /lib/i686/cmov/libc-2.9.so b7e8e000-b7e90000 r--p 00158000 08:03 129803 /lib/i686/cmov/libc-2.9.so b7e90000-b7e91000 rw-p 0015a000 08:03 129803 /lib/i686/cmov/libc-2.9.so b7e91000-b7e94000 rw-p 00000000 00:00 0 b7e94000-b7eb0000 r-xp 00000000 08:03 391429 /lib/libgcc_s.so.1 b7eb0000-b7eb1000 rw-p 0001c000 08:03 391429 /lib/libgcc_s.so.1 b7eb1000-b7eb2000 rw-p 00000000 00:00 0 b7eb2000-b7ed6000 r-xp 00000000 08:03 129894 /lib/i686/cmov/libm-2.9.so b7ed6000-b7ed7000 r--p 00023000 08:03 129894 /lib/i686/cmov/libm-2.9.so b7ed7000-b7ed8000 rw-p 00024000 08:03 129894 /lib/i686/cmov/libm-2.9.so b7ed8000-b7fbe000 r-xp 00000000 08:03 373249 /usr/lib/libstdc++.so.6.0.13 b7fbe000-b7fc2000 r--p 000e5000 08:03 373249 /usr/lib/libstdc++.so.6.0.13 b7fc2000-b7fc3000 rw-p 000e9000 08:03 373249 /usr/lib/libstdc++.so.6.0.13 b7fc3000-b7fca000 rw-p 00000000 00:00 0 b7fdf000-b7fe3000 rw-p 00000000 00:00 0 b7fe3000-b7fff000 r-xp 00000000 08:03 392729 /lib/ld-2.9.so b7fff000-b8000000 r--p 0001b000 08:03 392729 /lib/ld-2.9.so b8000000-b8001000 rw-p 0001c000 08:03 392729 /lib/ld-2.9.so bfe7f000-bfe94000 rw-p 00000000 00:00 0 [stack] ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso] Welcome to FREEMallocAbortito Un grazie in anticipo!
__________________
MB: Aw9d-max CPU: E6600 @ 3,32ghz (vcore default 1,275), DDR2 2x1gb 3/4/4/12 @ 2,10V , VGA: POV 8800 GTS 320mb 648/1458/975. RAFFREDDAMENTO A LIQUIDO ARTIGINALE ...Vendo : ROUTER STATION PRO, SISTEMA EMEDDED. |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Oct 2009
Messaggi: 14
|
Codice:
void freeMalloc(conti *str1,int dim){
int i,j;
printf("\nWelcome to FREEMalloc");
for(i=0; i<dim; i++){
for(j=0;j<str1[i].nOprzn;j++)
(str1[i].str2);
free(str1);
}
}
se dim >= 2 la chiamata a free viene eseguita più volte e ciò è male (double free). |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jul 2008
Città: mondovi
Messaggi: 1491
|
Quote:
__________________
MB: Aw9d-max CPU: E6600 @ 3,32ghz (vcore default 1,275), DDR2 2x1gb 3/4/4/12 @ 2,10V , VGA: POV 8800 GTS 320mb 648/1458/975. RAFFREDDAMENTO A LIQUIDO ARTIGINALE ...Vendo : ROUTER STATION PRO, SISTEMA EMEDDED. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:26.










...








