Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [C] Matrici dinamiche

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59

    [C] Matrici dinamiche

    Ciao a tutti!!!

    Stavo provando a allocare dinamicamente le matrici.
    A dire il vero il programma che ho scritto funziona però vorrei conferma da qualcuno più esperto di me per vedere se salto qualcosa.
    Vi ringrazio anticipatamente
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void allocaMat(int ***, int *, int *);
    void insMat(int **, int, int);
    void stampa(int **, int, int);
    void liberaMat(int ***, int);
    
    int main()
    {
        int **mat=NULL;
        int r, c;
    
        allocaMat(&mat, &r, &c);
        insMat(mat, r, c);
        stampa(mat, r, c);
        liberaMat(&mat, r);
    
        return 0;
    }
    
    void liberaMat(int ***m, int r)
    {
        int i;
    
        for(i=0; i<r; i++){
            free((*m)[i]);
        }
    
        free(*m);
    }
    
    void stampa(int **m, int r, int c)
    {
        int i, j;
    
        printf("\n\n");
    
        for(i=0; i<r; i++){
            for(j=0; j<c; j++){
                printf("%d ", m[i][j]);
            }
            printf("\n");
        }
    }
    
    void insMat(int **m, int r, int c)
    {
        int i, j;
    
        for(i=0; i<r; i++){
            for(j=0; j<c; j++){
                printf("\nmatrice[%d][%d] = ", i+1, j+1);
                scanf("%d", &m[i][j]);
            }
        }
    }
    
    void allocaMat(int ***m, int *r, int *c)
    {
        int i;
    
        printf("\nInserire il numero di righe: ");
        scanf("%d", r);
        printf("\nInserire il numero di colonne: ");
        scanf("%d", c);
    
        *m=(int **)malloc((*r)*(sizeof(int *)));
    
        if(*m==NULL){
            printf("\n\nAllocazione impossibile...");
            exit(1);
        }
    
        for(i=0; i<*c; i++){
            (*m)[i]=(int *)malloc((*c)*sizeof(int));
            if(((*m)[i])==NULL){
                printf("\n\nAllocazione impossibile...");
            }
        }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Corretto. Tieni presente che alla void function liberaMat() non hai bisogno di passare il puntatore per "riferimento": la free() non ne modifica il valore, si limita a deallocare l'area di memoria da esso puntata. Avrebbe senso passarlo per "riferimento" se facessi una cosa del genere:

    codice:
    void liberaMat(int ***m, int r)
    {
        int i;
    
        for(i=0; i<r; i++){
            free((*m)[i]);
    	(*m)[i] = NULL;
        }
    
        free(*m);
        
        *m = NULL;
    }
    cioè appunto se andassi a modificare il valore del puntatore (in realtà diventa necessario solo per l'ultima istruzione, per l'altra andrebbe bene anche il passaggio per copia). Peraltro l'annullamento di un puntatore dopo la free() è operazione consigliata per evitare che eventuali altre free() accidentali sullo stesso puntatore possano causare problemi, infatti lo standard prevede che la chiamata free(NULL) non abbia effetti:

    codice:
    The free function causes the space pointed to by ptr to be deallocated, that is, made
    available for further allocation. If ptr is a null pointer, no action occurs.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    Ciao ti ringrazio veramente, allora modifico il codice in modo che il puntatore punti a NULL.
    Grazie mille

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.