Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[C] Dynamiczna alokacja. Czy ten kod jest dobry?

adam07172 18 Nov 2009 13:44 1839 1
  • #1
    adam07172
    Level 9  
    Witam. Mam wykonać polecenie: 'Stworzyć strukturę zawierającą dynamicznie zaalokowaną tablicę dwuwymiarową i jej wymiary. Tablica dwuwymiarowa jest reprezentowana przez odpowiedni wskaźnik.' Oprócz tego jeszcze zwolnić zaalokowaną pamięć.
    Oto co napisałem.. byłbym wdzięczny gdyby ktoś sprawdził czy dobrze to zrobiłem i ewentualnie pokazał mi błąd.
    Code:
    #include "matrix.h"
    


    typedef struct {
        int** tablica;
        int m;
        int n;
    } d_table;

    int main( int argc, char** argv ){
       int arrt[M_MAX][N_MAX];
       int m, n, i, k, l;
       k=l=i=0;

       srandom(1111);



       if (argc != 3)
       {
          printf("\nPodaj po nazwie programu dwie liczby naturalne okreslajace rozmiar macierzy (maksymalnie 9 na 9) np. 3 4\n");
          exit(1);
       }

       printf("\nOto liczba argumentow: %d\n", argc-1);

       n=atoi(argv[1]);
       m=atoi(argv[2]);
        /*Dynamiczna alokacja tablicy*/
        d_table tab;

        tab.tablica = (int*)malloc(m * sizeof(int*));
        for(i; i < m; ++i)
           tab.tablica[i] = (int*)malloc(n * sizeof(int));
       
        tab.m = m;
        tab.n = n;
       printf("\nWprowadzone rozmiary macierzy to: %d na %d\n",n,m);

       if( 0 != arr_rnd    ( arrt, &m, &n ) ){ return -1; }
       printf("\n");
       if( 0 != arr_disp   ( arrt,  m,  n ) ){ return -1; }
       printf("\n");
       if( 0 != arr_modifNR( arrt, &m, &n ) ){ return -1; }
       if( 0 != arr_disp   ( arrt,  m,  n ) ){ return -1; }
        for(k; k<tab.m; k++)
          {
             free(&tab.tablica[k]);
             }
        for(l; l<tab.n; l++)
          {
             free(&tab.tablica[l]);
             }
       return 0;
    }

  • #2
    H0miczek
    Level 20  
    Zdaje się, ze zamiast:
    Code:

        for(k; k<tab.m; k++)
          {
             free(&tab.tablica[k]);
             }
        for(l; l<tab.n; l++)
          {
             free(&tab.tablica[l]);
             }

    powinno byc:
    Code:

        for(k; k<tab.m; k++)
          {
             free(tab.tablica[k]);
             }
        free(tab.tablica);

    Nie jestem pewna czy tab.m czy tab.n ale trza zwolnic najpierw tablice "właściwe" a potem tablicę wskaźników na tablice :)