Malloc vs calloc

di il
10 risposte

Malloc vs calloc

Ciao a tutti, ho da poco iniziato a studiare il C per passione e devo dire che è abbastanza affascinante pensare cosa siano riusciti a fare considerando l'epoca.... comunque... mi trovo a scrivere qui perchè ho un dubbio( e vorrei una delucidazione) riguardo la gestione della memoria in c......


non flammatemi se scrivo quindi idiozie.... ma sono all'inizio

Mi è capitato fra i vari test, studiando, di lavorare con char ** (puntatore di puntatore tipo char, quindi array di stringhe) ed ho notato che se gli allocavo memoria dinamicamente con malloc in questo modo

#include <stdio.h>
#include <stdlib.h>

char **strings;

string = (char **)malloc (32 * (sizeof(char *));

poteva capitarmi di avere elementi dell'array già popolati senza che io li avessi manipolati (poteva capitare con valori sensati oppure no) e che quindi :

int getIndexByString(char **strings, int size, char *string2Find)
{
    int i;
    for (i=0;i<size;i++)
    {
        if (strings[i] != NULL)
        {
            if (strcmp(string2Find, strings[i]) == 0)
            {
                return i;
            }
        }
    }
    return -1;
}
questa funzione a volte funzionava ed a volte no in particolare "if (strings != NULL)".


ho risolto utilizzando calloc invece che malloc, che da quel che ho capito oltre che allocare la memoria richiesta l'azzera.

è normale oppure ho risolto per caso?


tnx.

10 Risposte

  • Re: Malloc vs calloc

    Scusa ma ti sei dato la risposta da solo
    calloc azzera la memoria prima di ritornarla.
  • Re: Malloc vs calloc

    Forse c'è un equivoco ...

    Con quella malloc hai allocato i puntatori alle 32 stringhe ma non lo spazio delle 32 stringhe.
    Quei puntatori andrebbero azzerati quindi va bene la calloc ma il fatto è che mancano le 32 malloc per le stringhe stesse (queste sì da fare con calloc per avere la sicurezza che le stringhe siano terminate a zero). Dove stanno queste allocazioni?
  • Re: Malloc vs calloc

    +m2+ ha scritto:


    Scusa ma ti sei dato la risposta da solo
    calloc azzera la memoria prima di ritornarla.

    se corretta sì appunto volevo capire se fosse giusto tutto quello che ho detto, sto andando da autodidatta e l'unico confronto ce l'ho qui col forum.
  • Re: Malloc vs calloc

    oregon ha scritto:


    Forse c'è un equivoco ...

    Con quella malloc hai allocato i puntatori alle 32 stringhe ma non lo spazio delle 32 stringhe.
    Quei puntatori andrebbero azzerati quindi va bene la calloc ma il fatto è che mancano le 32 malloc per le stringhe stesse (queste sì da fare con calloc per avere la sicurezza che le stringhe siano terminate a zero). Dove stanno queste allocazioni?
    sisi è giusto poi l'array lo popolo da un altra parte di codice che nn ho riportato ed in quel codice alloco mem alla singola stringa.


    il dubbio in se è appunto se nn azero la memoria è normale che mi trovo valori strani tipo stringhe di altri programmi compilati precedentemente o valori random?
  • Re: Malloc vs calloc

    Normalissimo. Ma il puntatore non è valido, ovvero quello a cui punta potrebbe variare in ogni momento. È bene azzerarlo.
  • Re: Malloc vs calloc

    oregon ha scritto:


    Normalissimo. Ma il puntatore non è valido, ovvero quello a cui punta potrebbe variare in ogni momento. È bene azzerarlo.
    perfetto tnx.

    ma la diatriba di performance fra malloc e calloc è ancora valida o con i moderni calcolatori la differenza è trascurabile?
    (giusto x sapere xke se nn ci fossero diff a questo punto userei solo calloc per non sbagliare).
  • Re: Malloc vs calloc

    Ispanicuz ha scritto:


    oregon ha scritto:


    Normalissimo. Ma il puntatore non è valido, ovvero quello a cui punta potrebbe variare in ogni momento. È bene azzerarlo.
    perfetto tnx.

    ma la diatriba di performance fra malloc e calloc è ancora valida o con i moderni calcolatori la differenza è trascurabile?
    (giusto x sapere xke se nn ci fossero diff a questo punto userei solo calloc per non sbagliare).
    ma quale diatriba di prestazioni?
  • Re: Malloc vs calloc

    La diatriba sulle performance e' una scemenza del 99.999999% (SEI 9 dopo la virgola) dei casi.

    Il motivo e' semplice/complesso:

    1) nel 99.99999 (SOLO cinque 9 dopo la virgola) le performance sono legate all'utilizzo di un algoritmo EFFICIENTE, dove per 'algoritmo' si intende un pezzo di codice decisamente complesso che fa un lavoro molto sofisticato o su una grandissima quantita' di dati.

    Il classico esempio e' l'ordinamento: con 10/100/1000 elementi un algoritmo vale l'altro.
    Ma con 100.000 o piu' elementi ci sono algoritmi che hanno performance infinitamente migliori (QuickSort) di altri (BubbleSort)

    2) nel rimanente 0.000009% dei casi, si tratta della realizzazione di una libreria molto specifica in cui anche un'operazione assembler in piu' penalizza le performance dell'algoritmo. Ad esempio perche' deve essere utilizzato 1.000.000 di volte.

    Ma, come puoi immaginare, chi realizza queste librerie/algoritmi sono persone con un bagaglio professionale stratosferico.

    3) negli altri casi, la consistenza delle informazioni (un vettore di puntatori appena creato NON PUO' AVERE puntatori che puntano da qualche parte!!!) e' INFINITAMENTE piu' importante delle performance.

    Metti che, per un errore di implementazione, tu allochi un vettore di puntatori il quale, non essendo stato inizializzato a 0, per un colpo di fortuna pazzesco contiene tutti indirizzi validi!
    La tua applicazone, SUL TUO COMPUTER, sembra funzionare perfettamente, MA appena installi l'applicazione su un'altro computer, l'applicaione schianta allegramente

    Trovare questo tipo di errorei e' UN BAGNO DI LACRIME E SANGUE.

    Quindi, la regola e': fare di tutto per assicurarsi di avere, per ogni variabile,/struttura dati/vettore, un valorie iniziale ragionevole.
    E' INFINITAMENTE PIU' IMPORTANTE questo di qualunque considerazione relativa alle performance.

    SE, e diconsi SE, ci dovessero essere problemi di performance, questi dovranno essere analizzati puntualmente perche' NON E' l'INTERO programma a non essere efficiente, ma sono un particolare pezzettino.

    E per questo PARTICOLARE pezzettino e' necessario CAPIRE il motivo della inefficienza, e risolverlo. Se possibile!
  • Re: Malloc vs calloc

    Provo a articolare un pochino meglio
    1) i tempi di esecuzione, su sistemi desktop, dipendono in misura non predicibile direttamente dal programma medesimo
    2) esistono tante CPU diverse, ognuna delle quali funziona in modo diverso, con tanti sistemi operativi che usano strategie diverse eccetera
    3) in termini generali i "costi one-time" sono modesti. in fase di inizializzazione delle variabili (cosa che è sempre bene fare, soprattutto nei caso dei puntatori, anche solo per capire quando sono pieni o vuoti) avrai un "qualcosa" che gira 1 sola volta (o un numero limitato di volte). Mentre l'esecuzione di cicli, più o meno complessi, verrà eseguita tante-tantissime-tantissimissime volte.
    Ecco quindi che "ottimizzare" qualche microsecondo in fase di inizializzazione delle variabili non ha molto senso.
    Per inciso, inoltre, CPU moderne sono in grado di eseguire codice anche molto complesso (es. AES) fino a (oggi) 19GB/s
    Insomma... non siamo più negli anni 60, dove ci si ponevano questi "problemi esistenziali"

    PS per inciso: non usare mai e poi mai confronto stringhe senza un limite prefissato (variante n delle funzioni), perchè sono ottima fonte di guai, da lievi a molto gravi
  • Re: Malloc vs calloc

    migliorabile ha scritto:


    La diatriba sulle performance e' una scemenza del 99.999999% (SEI 9 dopo la virgola) dei casi.

    Metti che, per un errore di implementazione, tu allochi un vettore di puntatori il quale, non essendo stato inizializzato a 0, per un colpo di fortuna pazzesco contiene tutti indirizzi validi!
    La tua applicazone, SUL TUO COMPUTER, sembra funzionare perfettamente, MA appena installi l'applicazione su un'altro computer, l'applicaione schianta allegramente


    è esattamente quello che succedeva......


    comunque ragazzi grazie mille gentili, veloci, efficienti
Devi accedere o registrarti per scrivere nel forum
10 risposte