2010-09-04 13 views
3

Dans le code suivant, quel est le sens de buf = malloc(n * sizeof(char));Doute à malloc. C (Linux)

est n * sizeof (char) nécessaire, si oui .. s'il vous plaît élaborer.

int n; 

char* buf; 

fstat(fd, &fs); 

n = fs.st_size; 

buf = malloc(n * sizeof(char)); 

EDIT1 Et si j'écris (n * sizeof (Double))

+0

Il n'est pas nécessaire, parce que 'sizeof (char)' est ([toujours 1] http://stackoverflow.com/questions/2215445/are-there-machines-where- sizeofchar-1). Cependant, certaines personnes préfèrent l'uniformité; il est évalué à la compilation, donc peu importe. –

+0

C'est toujours 1 dans les compilateurs compatibles C99, que vous devriez toujours prendre avec un grain de sel. Même les compilateurs les plus modernes ne sont pas "entièrement" conformes à C99. –

+0

@David, c'est nécessaire depuis [C89] (http://flash-gordon.me.uk/ansi.c.txt), sinon avant. –

Répondre

6

La fonction malloc alloue octets et prend en entrée le nombre d'octets que vous souhaitez allouer. L'opérateur sizeof renvoie le nombre d'octets pour un type donné. Dans ce cas, un char est de 1 octet, mais dans le cas d'un int, il est très probable que 4 octets ou double correspondent à 8 octets. L'expression n * sizeof(char) convertit le nombre de char en nombre d'octets souhaités.

Dans le cas illustré, en utilisant char, le calcul du nombre d'octets est probablement pas nécessaire, mais il faut le faire car il aide à transmettre votre intention.

Qu'est-ce que l'expression fait alloue la quantité de mémoire souhaitée nécessaire pour maintenir au plus n nombre de char « s et vous retourner un pointeur, buf, au début de cette mémoire allouée.

+0

Peut-être que le PO demande parce que sizeof (char) est défini pour être toujours 1. –

+0

J'ai pensé à cela, mais tout ce qu'il en coûtera à quelqu'un est une multiplication par 1 instruction dans le cas où ils font «char». Je pense que l'intention de transport ici pondère. – linuxuser27

+2

... et le compilateur optimisera la multiplication par 1. –

1

La norme ISO définit un byte de la même taille qu'un char.

Vous ne devez sizeof(char) pour malloc