3

In the following code,what is the meaning of buf = malloc(n * sizeof(char));

is n*sizeof(char) necessary,if yes.. please elaborate.

int n;

char* buf;

fstat(fd, &fs);

n = fs.st_size;

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

EDIT1 And What if I write (n*sizeof(double))

Pavitar
  • 4,282
  • 10
  • 50
  • 82
  • It's not necessary, because `sizeof(char)` is [always 1](http://stackoverflow.com/questions/2215445/are-there-machines-where-sizeofchar-1). However, some people prefer it for uniformity; it's evaluated at compile-time, so it doesn't matter much. – Matthew Flaschen Sep 04 '10 at 04:41
  • It's always 1 in C99 compliant compilers, which you should always take with a grain of salt. Even most modern compilers aren't "fully" C99 compliant. – David Titarenco Sep 04 '10 at 04:50
  • @David, it's required since [C89](http://flash-gordon.me.uk/ansi.c.txt), if not before. – Matthew Flaschen Sep 04 '10 at 05:06
  • The definition of `sizeof` has *always* been in units of `char`. Nothing else would make any sense. A `char` is one `char` so its size is 1. – R.. GitHub STOP HELPING ICE May 30 '11 at 02:31

2 Answers2

6

The malloc function allocates bytes and takes as input the number of bytes you would like to allocate. The sizeof operator returns the number of bytes for a given type. In this case a char is 1 byte, but in the case of an int it is most likely 4 bytes or double is most likely 8 bytes. The expression n * sizeof(char) converts the number of char into the number of bytes that are desired.

In the case illustrated, using char, computing the number of bytes is probably not needed, but it should be done as it helps to convey your intent.

What the expression is doing is allocating the desired amount of memory needed to hold at most n number of char's and returning you a pointer, buf, to the beginning of that allocated memory.

linuxuser27
  • 7,183
  • 1
  • 26
  • 22
1

The ISO standard defines a byte as the same size as a char.

You never need sizeof(char) for malloc

codaddict
  • 445,704
  • 82
  • 492
  • 529