Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322

    allocazione memoria dinamica, è corretto così?

    ho necessità di avere un vettore che contenga caratteri. pero siccome la quantità di caratteri è varibiale e puo oltrepassare quella del vettore ho necessità di usare l'allocazione dinamica, tramite la funzione realloc (anche forzato dal prof in questa scelta).

    è corretta una cosa del genere?

    int dim_iniziale,allocati,blocco,usati;

    dim_iniziale=50; // dim iniziale della stringa
    allocati=dim_iniziale; // mem allocata all'inizio
    usati=0; // caratteri usati
    blocco=50; // blocchi di memoria

    char *array;
    array= (char *)malloc(sizeof(char) * dim_iniziale);


    poi andando a incrementare la variabile usati a ogni carattere aggiunto, quando usati supera allocati faccio:

    if (usati > allocati) {
    allocati = allocati + blocco;
    array = (char *)realloc(array,allocati);
    }
    if (usati > allocati) {
    allocati = allocati + blocco;
    array = (char *)realloc(array,allocati);
    }


    e quando ho finito

    free(array);

    secondo voi è corretto?

    i miei dubbi sono sopratutto sulla malloc iniziale...come fareste voi?

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322

    Re: allocazione memoria dinamica, è corretto così?

    array= (char *)malloc(sizeof(char) * dim_iniziale);
    ho fatto qualche prova. il programma pare che funzioni sia con

    array= (char *)malloc(sizeof(char) * dim_iniziale);

    che con:

    array= (char *)malloc(dim_iniziale);

    quale dei due è corretto? se lo è uno dei due...

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

    Re: Re: allocazione memoria dinamica, è corretto così?

    Originariamente inviato da jacopos81
    ho fatto qualche prova. il programma pare che funzioni sia con

    array= (char *)malloc(sizeof(char) * dim_iniziale);

    che con:

    array= (char *)malloc(dim_iniziale);

    quale dei due è corretto? se lo è uno dei due...
    Il primo!
    Specificare la dimensione del singolo elemento (moltiplicata poi per una quantità) è sempre la cosa migliore, anche nel caso in cui sizeof(char) vale appunto 1.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: allocazione memoria dinamica, è corretto così?

    if (usati > allocati) {
    allocati = allocati + blocco;
    array = (char *)realloc(array,allocati);
    }

    /* qui è scappato un paste di troppo immagino */

    if (usati > allocati) {
    allocati = allocati + blocco;
    array = (char *)realloc(array,allocati);
    }
    /* ---- */

    free(array);
    Per sicurezza farei:
    if (usati>=allocati) {
    allocati = allocati+blocco+1
    ....
    }
    per avere la sicurezza che il pointer rimanga nel campo della validità ed eventualmente mettere il NULL alla fine.
    Inoltre in teoria si dovrebbe sempre fare il controllo sul pointer ritornato dalla malloc, in teoria non è detto che l'allocazione riesca.
    (Anche se era più probabile tempo fa con le macchine che avevano poca memoria)

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322
    grazie per i consigli

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    Altro consiglio: il linguaggio specificalo anche nel titolo, come indicato nel Regolamento, altimenti rischi la chiusura della discussione.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    322

    Re: Moderazione

    Originariamente inviato da LeleFT
    Altro consiglio: il linguaggio specificalo anche nel titolo, come indicato nel Regolamento, altimenti rischi la chiusura della discussione.


    Ciao.

    azz.. vero, stavolta me l'ero scordato..

    troppo tempo a programmare

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 © 2024 vBulletin Solutions, Inc. All rights reserved.