Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] Debug Error!

  1. #1

    [C] Debug Error!

    Ciao a tutti.

    Ho compilato un programma con il Visual C++ senza avere errori.
    Questo programma legge da file, inizializza una matrice di caratteri e fa alcune operazioni in modo corretto.
    Quando provo ad eseguirlo funziona correttamente quasi fino alla fine quando voglio liberare la memoria allocata precedentemente:
    codice:
    for (i=0; i< nr;i++)
       free(m[i]);
    ree(m);
    Mi appare la finestra di Windows con pallino rosso e crce bianca:
    ____________________________________________
    |MIcrosoft Visual C++ Debug Library
    |___________________________________________
    | Debug Error!
    |Program:C:\prova\Debug\prova.exe
    |DAMAGE: after Normal block (#41) at 0x00441F90
    |___________________________________________

    A cosa pùò essere dovuto?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E' un problema legato alla allocazione/liberazione della memoria.

    Controlla, passo passo, quando si verifica (se nel ciclo o per l'ultima free).

  3. #3
    Si verifica sulla prima free
    codice:
    free(m[i]);
    Se gli dico di ignorare mi ripete lo stesso errore su tutte le free tranne su free(m) (fuori dal for)

    Ho provato a mettere prima del ciclo for
    codice:
    free(m[0]);
    e si pianta proprio su questa.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [C] Debug Error!

    Originariamente inviato da spiderontheweb
    A cosa pùò essere dovuto?
    Come hai dichiarato quel 'm'?? Come fai la allocazione della matrice?? Senza saperlo, è difficile capire dove sta il problema.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Premesso che il programma funziona correttamente fino alla free:

    codice:
    //prototipo
    char **MallocChar(int nr, int nc);
    
    main()
    {
       char **m; //dichiara m
       ...
       m=MallocChar(nr, nc); //chiamata alla funzione
       ...
       
       for (i=0; i< nr;i++) 
          free(m[i]); //qua si pianta!!!!!!!
       free(m);
       
       return 0;
    }
    
    //funzione per allocare la memoria
    char **MallocChar(int nr, int nc)
    {
       int i;
       char **m;
       m = (char **)malloc(nr * sizeof(char *));
       for (i=0; i< nr;i++)
          m[i] = (char *)malloc(nc * sizeof(char));
       return m;
    }
    Mi sembra ok...

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Probabilmente e' qualcosa che fai tra la malloc e la free ... qualcosa che sta nei "puntini" che hai indicato ...

  7. #7
    Questo è il codice. Non l'ho scritto io.

    codice:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #define N_MOSSE 8
    
    int r[N_MOSSE][2] = {
    	{ 1, 1},
    	{ 1, 0},
    	{ 1,-1},
    	{ 0,-1},
    	{-1,-1},
    	{-1, 0},
    	{-1, 1},
    	{ 0, 1}
    };
    
    int nr, nc, superficie;
    float altezza_media;
    int totale;
    
    void cerca_elemento_matrice(int x, int y, char **m);
    char **MallocChar(int nr, int nc);
    
    
    main() 
    {
    	char **m;
    	FILE *f;
    	int  i=0, c;
    	int conta_isole=0;
    	char riga[30];
    	
    	f = fopen("dati.txt", "r");
    	if (f== NULL)
    	{
    		printf("Errore apertura file\n");
    		exit(1);
    	}
    	else 
    		fscanf(f, "%d %d ", &nr, &nc);
    	m=MallocChar(nr, nc);
    	while(fscanf(f, "%s",riga )!=EOF)
    	{
    		//m[r] = malloc (nc * sizeof (char));
    		strcpy( m[i],riga); 
    		printf("%s\n", m[i]);
    		i++;
    	}
    	for(i=0;i<nr;i++)
    		for(c=0;c<nc;c++)
    		{
    			if(m[i][c]!='#' && m[i][c]!='0')
    			{
    				totale=0;
    				altezza_media=0.0;
    				superficie=0;
    				conta_isole++;
    				cerca_elemento_matrice( i ,c , m );
    				altezza_media=(totale/(float)superficie);
    				printf("%d %f\n", superficie, altezza_media);
    			}	
    		}   
            
            getchar();
            free(m[0]);     
    		for (i=0; i< nr;i++)
    		{
    			free(m[i]);
            }
    		free(m);
    		return 0;		
    }
    
    void cerca_elemento_matrice(int x, int y, char **m)
    {
    	if(x >= 0 && x < nr && y >= 0 && y < nc && m[x][y]!='#' && m[x][y]!='0')
    	{
    		int i;
    		totale+=(m[x][y]-'0');
    		superficie++;
    		m[x][y]='#';
    		for( i = 0; i < N_MOSSE; i++ )
    			cerca_elemento_matrice( x + r[i][0], y + r[i][1], m);
    	}
    	return;
    }
    
    char **MallocChar(int nr, int nc)
    {
    	int i;
    	char **m;
    	m = (char **)malloc(nr * sizeof(char *));
    	for (i=0; i< nr;i++)
    		m[i] = (char *)malloc(nc * sizeof(char));
    	return m;
    }

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da spiderontheweb
    Mi sembra ok...
    Sì, confermo che allocazione e de-allocazione sono OK.

    Posso solo supporre che da qualche parte nel programma si va a "sovrascrivere" delle aree di memoria dove non si dovrebbe .... danneggiando ad es. i puntatori e/o l'heap.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.