3

I am writing an application in c in which I'm allocating the memory needed for some arrays dynamically. I know that many of those arrays will need zero allocation. So, will there be a problem when I call free on them? egfree(malloc(0 * sizeof(int)));? I know my application compiles and runs ok on my machine, but can I rely on this? Cheers!

Stamoulohta
  • 649
  • 1
  • 7
  • 21

4 Answers4

8

You can safely free(malloc(0)).

from man malloc:

If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be suc‐ cessfully passed to free().

free:

If ptr is NULL, no operation is performed

sverre
  • 6,768
  • 2
  • 27
  • 35
  • Ooops! So I can call `free()` safely but, when I call `malloc()` I do check for the result too like: `if(!(arr = malloc(0))){ start screaming!}`... If `malloc(0)` is implementation dependent, this will fail, right? – Stamoulohta Jan 10 '12 at 18:26
  • 1
    Yeah, if you think `malloc()` returning `NULL` is an error then you can't call `malloc(0)`. `malloc()` will set `errno` to `ENOMEM` on failure, so you can check that instead though. – sverre Jan 10 '12 at 18:29
  • 1
    To use `errno` here, you'd have to set it to 0 before calling `malloc`, and even then, it would be less reliable than I'd like. A better test would be just checking whether the size argument was 0 after `malloc` returns null, in which case it's not a failure. – R.. GitHub STOP HELPING ICE Jan 10 '12 at 18:46
4

malloc(0) may (this is implementation-defined) return a null pointer, or may return a new pointer each time you call it. In either case, the return value is valid to pass to free, since free(0) is a no-op anyway. However, due to some nasty issues with detecting and handling failure of realloc and disagreements between ISO C and POSIX, I would strongly advise you never to pass size 0 to malloc or realloc. You can always simply add +1 or |1 to the end of the argument to malloc, and then you're certain to get a unique pointer (different from the null pointer or the address of any other object) every time you call it.

Another reason not to use malloc(0) is that you have to always check the return value of malloc to detect failure, whereas malloc(0) can return a null pointer on success. This makes all of your error checking code more complicated since you have to special-case the non-error case where the size argument was 0.

R.. GitHub STOP HELPING ICE
  • 208,859
  • 35
  • 376
  • 711
1

It is always legal to call free on the result of malloc (once).

Laurence Gonsalves
  • 137,896
  • 35
  • 246
  • 299
0

Yes, free(malloc(0)) is guaranteed to work.

For a further discussion, see what's the point in malloc(0)?

Community
  • 1
  • 1
NPE
  • 486,780
  • 108
  • 951
  • 1,012