Delucidazioni funzione malloc()

di il
10 risposte

Delucidazioni funzione malloc()

Ho precedentemente controllato che nulla di simile fosse stato richiesto prima, quindi non dovrebbero esserci problemi di post simili. Innanzitutto buona sera a tutta la community, avendo da poco iniziato ingegneria informatica avrei delle domande banali sulla funzione malloc().
1. Non ho ben compreso quando sia preferibile utilizzare una malloc invece che un array normale (tranne nel caso in cui io non possa conoscere a priori la dimensione, allora la malloc sarebbe preferibile ad un array sovradimensionato).
2. Come posso fare a riempire uno spazio di memoria allocato con la malloc? Nel caso io allocassi 10 byte e volessi metterci dei char dovrei fare sempre : stringa[0]='a'; stringa[1]='b'; ecc...?
3. Ho scritto un codice basilare per comprendere meglio la sua struttura e funzione:

#include <stdlib.h>
int main (void){
*char stringa = malloc (10); //ho omesso il *sizeof(char) perchè essendo i char grandi
free(stringa); //1 byte non era necessario vero?

debuggando, noto con orrore che invece di allocarmi 10 byte di memoria (correggetemi se sbaglio),
ne alloca di più senza un valido motivo. Vi chiedo aiuto per capire dove sbaglio.

Buona giornata a tutti da un neofita

10 Risposte

  • Re: Delucidazioni funzione malloc()

    La malloc permette di allocare memoria usando l'heap

    Lo spazio allocato lo utilizzi come vuoi, tramite il puntatore che ottieni dalla malloc

    Non

    *char stringa

    ma

    char *stringa

    Per la quantità allocata, è normale che possa allocarne di più. Dipende dall' "allineamento" dei dati che, può essere a 32 bit (quindi 4 byte) ... per cui non vengono allocati 10 byte ma multipli di 4 (almeno 12). Comunque può essere anche un valore diverso e dipende da come viene gestito l'heap dal runtime. Se non per particolari esigenze, non te ne preoccupare.
  • Re: Delucidazioni funzione malloc()

    1) sizeof(char) == 1: dovrebbe essere sempre cosi, ma e' buona pratica usare sempre sizeof
    2) lo stack, dove allochi l'array normale, ha una dimensione limitata. e' buona norma usare lo heap per oggetti di grandi dimensione
    3) il sistema alloca sempre multipli di una quantita' minima (16, 32, ....), sia per problemi di allineamento, legato all'hardware, sia perche' oltre allo spazio di memoria che serve a te, deve mantenere delle strutture dati di servizio necessarie per implementare la free.

    La gestione della memoria in C/C++ e' un argomento decisamente complesso, che non si limita alla sola malloc/calloc/free, new/delete.
  • Re: Delucidazioni funzione malloc()

    Grazie per le risposte tempestive. Non fate caso all'eresia scritta in quelle righe di codice, l'ora tarda mi ha giocato brutti scherzi. Non ho ancora capito come è possibile inizializzare la memoria allocata dalla malloc, esiste un altro modo oltre a quello elemento per elemento?

    Per la storia della dimensione quindi non mi devo preoccupare se lui alloca così tanta memoria?
    Tanto alla fine se io volessi fare una "stringa" di char 0 terminata, lui capirebbe che dove c'è quel carattere la stringa termina, vero? Questo però si ricollega con la mia mancanza di saper inizializzare la memoria di una malloc.

    Ultima domanda: E' possibile utilizzare una strlen fornendole il puntatore alla memoria allocata dalla malloc?

    Grazie ancora
  • Re: Delucidazioni funzione malloc()

    LorenzoB ha scritto:


    inizializzare
    In che senso? Vuoi mettere tutto a zero? O impostare particolari valori?
    Puoi usare la funzione memcpy per impostare i valori nel vettore.
    così tanta memoria?
    Non è "tanta memoria" ...

    Le stringhe le tratti con le funzioni apposite che tengono conto del carattere \0 finale.
    strlen
    Ovviamente sì, a patto che il buffer sia terminato da \0
  • Re: Delucidazioni funzione malloc()

    La mia idea era quella di sostituire praticamente ovunque l'uso degli array con la funzione malloc (per vedere se effettivamente era una strada percorribile che poteva offrire vantaggi effettivi), per questo ero interessato a "riempire" la memoria allocata in qualche modo. Mi guarderò la funzione memcpy (per l'inizializzazione a 0 dovrei utilizzare la calloc() se non erro) per dare valori alla mia memoria.
    Nel caso dove io non abbia una stringa [quindi ad esempio: int *numeri = malloc (10*sizeof(int)) ] come posso ottenere la lunghezza di 'numeri'? la strlen non funziona in quanto accetta solamente stringhe (char*).

    Un'altra cosa che stamattina mi ha dato da fare è stato questo programma:
    int *arr_el_com(int *stringa1, int *stringa2, int size1, int size2){
    
    	if (size1 >= size2){
    
    		int *nuovovettore = malloc((size1)*sizeof(int));
    		int l = 0;
     		for (int i = 0; i < size1; ++i){
    
    			 for (int j = 0; j < size2; ++j){
    
     				if (stringa1[i] == stringa2[j]){
    					nuovovettore[l] = stringa1[i];
    					++l;
    				}
     			}
    		}
                    return nuovovettore;
    
                    else 
                    return NULL;
    	}
    
    
    Questa funzione prende due vettori classici e le loro dimensioni per restituire un vettore con gli elementi comuni dei due (se e solo se la dim della stringa1>= dim stringa2). Funziona tutto bene, ma il vettore ritornato non si limita solo agli elementi comuni, ma anche ad altri elementi non inizializzati. Sapete identificare il mio errore?

    Ringrazio
  • Re: Delucidazioni funzione malloc()

    La lunghezza è proprio 10*sizeof(int) ma che importanza ha?

    Per la funzione, gli elementi in comune possono essere meno di quelli che hai allocato con la malloc. Gli altri sono casuali.

    P.S. Come da regolamento e per evitare confusione dovresti fare una sola domanda per thread
  • Re: Delucidazioni funzione malloc()

    Mi atterrò prettamente alla domanda allora, per evitare confusione.
    Visto che (ovviamente) gli elem simili possono essere inferiori a quelli allocati con la malloc, come posso fare per restituire un puntatore ad un vettore che abbia solamente gli elementi uguali? dovrei fare una nuova malloc di dimensioni appropriate (se ho 5 elem. uguali allocherò 5*sizeof(int) elem) e poi copiarci dentro i suddetti?

    Saluti
  • Re: Delucidazioni funzione malloc()

    Basta usare una appropriata realloc alla fine
  • Re: Delucidazioni funzione malloc()

    Non ci avevo pensato, grazie per le delucidazioni. Posso scrivere ancora messaggi su questo post nel caso avessi ulteriori dubbi oppure no?
  • Re: Delucidazioni funzione malloc()

    Solo se ti riferisci alla malloc ... altrimenti, ti ho detto, si finisce per parlare di tutto e questo non serve a chi fa le ricerche sul titolo ...
Devi accedere o registrarti per scrivere nel forum
10 risposte