Domanda

Qual è lo scopo dell'utilizzo sizeof servendosi malloc in C?Perché è necessario?

Voglio dire possiamo usare sizeof ma conosciamo già la dimensione (=1000 byte) che stiamo allocando in memoria?

Sono principiante in C so.Questa potrebbe essere una domanda molto ovvia.

È stato utile?

Soluzione

Tipi di dati e materia di memoria

La risposta è nei tipi di dati.Mentre sai quanti oggetti si desidera allocare la memoria per, non si può decidere di passare attraverso la briga di calcolare mentalmente le loro dimensioni.

Così fa la manutenibilità

Inoltre, cosa succede se la composizione di questi cambiamenti in seguito?Allora sei fottuto e devi modificare tutto.

Quindi questo è irrilevante nel tuo esempio, senza contesto.Ma nel caso in cui si desideri allocare memoria per cose più complesse (ad esempio, una struttura con un numero di campi), diventa piuttosto importante e utile.

Esempio 1 (non così importante qui):

char *s = malloc(100 * sizeof(char));

Ma hey, è solo chars, va bene, avresti potuto farlo:

char *s = malloc(100);

Generalmente funziona.Ma spararti ai piedi, come vedrai qui sotto.

Esempio 2 (conta già un po'):

int *i = malloc(100 * sizeof(int));

Certo, avresti potuto scriverlo:

int *i = malloc(100 * 4);

Cioè, supponendo che tu sviluppi per una sola architettura che conosci abbastanza bene.

Esempio 3 (iniziando a contare un po'!):

typedef struct s_listelement{
    int                  dataitem;
    struct s_listelement *link;
}              t_listelement;

t_listement *le = malloc(sizeof(t_listelement));

Ora immagina che la struttura dell'elemento della lista collegata contenga un sacco di altri campi...

Vuoi fidarti sizeof(), o vada a divertirsi e faccia la matematica Lei?

Altri suggerimenti

Supponiamo di voler allocare memoria per la memorizzazione ints.La tua ipotesi iniziale sarà, ok ho bisogno di avere n interi e ogni intero richiede x byte.Quindi lo spazio sarà n*x byte.

Ma in realtà questo x dipende dall'architettura.Forse 16 bit, 32 bit, ecc.Quindi, per rendere il codice in grado di funzionare in ambienti diversi, si consiglia di utilizzare n*sizeof(int) anziché n*x.

Ad esempio, se è necessario allocare spazio per 10 numeri interi:

int *p=malloc(sizeof(int)*10);

Cosa succede se si modifica la dimensione di mallocated?

Dovrai 1) calcolare nuovamente la nuova dimensione (lasciando da parte più problemi di architetture di destinazione, dove dovrai calcolare la nuova dimensione in ogni destinazione), 2) cerca tutti malloc(1000), assicuri che si riferisce a mallocated (che potrebbe non essere ovvio) e sostituire con una nuova dimensione.

Non hai nessuno di questi 2 problemi usando sizeof.Quindi usando sizeof porta a un codice più gestibile e leggibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top