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!

9
  • 1
    Do be aware that malloc(0) is implementation defined. Commented Jan 10, 2012 at 18:19
  • @Mysticial: Yes, but you can free any result it returns (either a valid pointer or NULL), right? Commented Jan 10, 2012 at 18:21
  • What does this have to do with zero-initialization of arrays? Commented Jan 10, 2012 at 18:21
  • @FredLarson Correct, but if malloc(0) returns NULL, it could trigger out-of-memory checks that check for NULL. Commented Jan 10, 2012 at 18:22
  • 1
    @FredLarson: oh, sorry, misread it. My eyes must be getting tired. Commented Jan 10, 2012 at 18:26

4 Answers 4

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

Sign up to request clarification or add additional context in comments.

3 Comments

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?
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.
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.
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.

Comments

1

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

Comments

0

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

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.