Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Can realloc(p,0) return NULL when p is non-NULL and memory aplenty?

Reply
Thread Tools

Can realloc(p,0) return NULL when p is non-NULL and memory aplenty?

 
 
Francois Grieu
Guest
Posts: n/a
 
      03-06-2008
When running the following code under MinGW, I get
realloc(p,0) returned NULL
Is that a non-conformance?

TIA,
Francois Grieu

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
void *p;
p = malloc(0);
if (p==NULL)
puts("malloc(0) returned NULL");
else
{
p = realloc(p,0);
if (p==NULL)
puts("realloc(p,0) returned NULL");
else
puts("realloc(p,0) did not return NULL");
}
return 0;
}
 
Reply With Quote
 
 
 
 
Joachim Schmitz
Guest
Posts: n/a
 
      03-06-2008
Francois Grieu wrote:
> When running the following code under MinGW, I get
> realloc(p,0) returned NULL
> Is that a non-conformance?

Whether malloc(0) returns NULL or a pointerr to 0 bytes is implementation
defined
I think the same is true for realloc(p, 0)

Bye, Jojo


 
Reply With Quote
 
 
 
 
Walter Roberson
Guest
Posts: n/a
 
      03-06-2008
In article <(E-Mail Removed)>,
Francois Grieu <(E-Mail Removed)> wrote:
>When running the following code under MinGW, I get
>realloc(p,0) returned NULL
>Is that a non-conformance?


No, it is conformance, and returning non-NULL would be non-conformance.

C89 4.10.3.4 The realloc Funciton

If size is zero and ptr is not a null pointer, the object
it points to is freed.

Returns

The realloc function returns either a null pointer or a
pointer to the possibly moved allocated space.


In the case of zero as the size, there is no more allocated space
(because zero size requires freeing), so the other branch of the
'either' kicks in, requiring realloc to return a null pointer
for this case.
--
amazon.com's top 8 books about "walter" are Kotzwinkle/ Gundy/ Colman's
"Walter the Farting Dog"
 
Reply With Quote
 
Joachim Schmitz
Guest
Posts: n/a
 
      03-06-2008
Walter Roberson wrote:
> In article
> <(E-Mail Removed)>,
> Francois Grieu <(E-Mail Removed)> wrote:
>> When running the following code under MinGW, I get
>> realloc(p,0) returned NULL
>> Is that a non-conformance?

>
> No, it is conformance, and returning non-NULL would be
> non-conformance.
>
> C89 4.10.3.4 The realloc Funciton
>
> If size is zero and ptr is not a null pointer, the object
> it points to is freed.
>
> Returns
>
> The realloc function returns either a null pointer or a
> pointer to the possibly moved allocated space.
>
>
> In the case of zero as the size, there is no more allocated space
> (because zero size requires freeing), so the other branch of the
> 'either' kicks in, requiring realloc to return a null pointer
> for this case.

From n1256:
7.20.3 Memory management functions

1 The order and contiguity of storage allocated by successive calls to the
calloc,
malloc, and realloc functions is unspecified. The pointer returned if the
allocation
succeeds is suitably aligned so that it may be assigned to a pointer to any
type of object
and then used to access such an object or an array of such objects in the
space allocated
(until the space is explicitly deallocated). The lifetime of an allocated
object extends
from the allocation until the deallocation. Each such allocation shall yield
a pointer to an
object disjoint from any other object. The pointer returned points to the
start (lowest byte
address) of the allocated space. If the space cannot be allocated, a null
pointer is
returned. If the size of the space requested is zero, the behavior is
implementationdefined:
either a null pointer is returned, or the behavior is as if the size were
some
nonzero value, except that the returned pointer shall not be used to access
an object.

....

7.20.3.4 The realloc function
....
3 If ptr is a null pointer, the realloc function behaves like the malloc
function for the
specified size



So it surely seems implementation defined to me.



Bye, Jojo


 
Reply With Quote
 
Joachim Schmitz
Guest
Posts: n/a
 
      03-06-2008
Joachim Schmitz wrote:
> Walter Roberson wrote:
>> In article
>> <(E-Mail Removed)>,
>> Francois Grieu <(E-Mail Removed)> wrote:
>>> When running the following code under MinGW, I get
>>> realloc(p,0) returned NULL
>>> Is that a non-conformance?

>>
>> No, it is conformance, and returning non-NULL would be
>> non-conformance.
>>
>> C89 4.10.3.4 The realloc Funciton
>>
>> If size is zero and ptr is not a null pointer, the object
>> it points to is freed.
>>
>> Returns
>>
>> The realloc function returns either a null pointer or a
>> pointer to the possibly moved allocated space.
>>
>>
>> In the case of zero as the size, there is no more allocated space
>> (because zero size requires freeing), so the other branch of the
>> 'either' kicks in, requiring realloc to return a null pointer
>> for this case.

> From n1256:
> 7.20.3 Memory management functions
>
> 1 The order and contiguity of storage allocated by successive calls
> to the calloc,
> malloc, and realloc functions is unspecified. The pointer returned if
> the allocation
> succeeds is suitably aligned so that it may be assigned to a pointer
> to any type of object
> and then used to access such an object or an array of such objects in
> the space allocated
> (until the space is explicitly deallocated). The lifetime of an
> allocated object extends
> from the allocation until the deallocation. Each such allocation
> shall yield a pointer to an
> object disjoint from any other object. The pointer returned points to
> the start (lowest byte
> address) of the allocated space. If the space cannot be allocated, a
> null pointer is
> returned. If the size of the space requested is zero, the behavior is
> implementationdefined:
> either a null pointer is returned, or the behavior is as if the size
> were some
> nonzero value, except that the returned pointer shall not be used to
> access an object.
>
> ...
>
> 7.20.3.4 The realloc function
> ...
> 3 If ptr is a null pointer, the realloc function behaves like the
> malloc function for the
> specified size

Oops, that section is irrelevant...

> So it surely seems implementation defined to me.

But from the 1st section I think this still holds true

Bye, Jojo


 
Reply With Quote
 
Joachim Schmitz
Guest
Posts: n/a
 
      03-06-2008
Joachim Schmitz wrote:
> Joachim Schmitz wrote:
>> Walter Roberson wrote:
>>> In article
>>> <(E-Mail Removed)>,
>>> Francois Grieu <(E-Mail Removed)> wrote:
>>>> When running the following code under MinGW, I get
>>>> realloc(p,0) returned NULL
>>>> Is that a non-conformance?
>>>
>>> No, it is conformance, and returning non-NULL would be
>>> non-conformance.
>>>
>>> C89 4.10.3.4 The realloc Funciton
>>>
>>> If size is zero and ptr is not a null pointer, the object
>>> it points to is freed.
>>>
>>> Returns
>>>
>>> The realloc function returns either a null pointer or a
>>> pointer to the possibly moved allocated space.
>>>
>>>
>>> In the case of zero as the size, there is no more allocated space
>>> (because zero size requires freeing), so the other branch of the
>>> 'either' kicks in, requiring realloc to return a null pointer
>>> for this case.

>> From n1256:
>> 7.20.3 Memory management functions
>>
>> 1 The order and contiguity of storage allocated by successive calls
>> to the calloc,
>> malloc, and realloc functions is unspecified. The pointer returned if
>> the allocation
>> succeeds is suitably aligned so that it may be assigned to a pointer
>> to any type of object
>> and then used to access such an object or an array of such objects in
>> the space allocated
>> (until the space is explicitly deallocated). The lifetime of an
>> allocated object extends
>> from the allocation until the deallocation. Each such allocation
>> shall yield a pointer to an
>> object disjoint from any other object. The pointer returned points to
>> the start (lowest byte
>> address) of the allocated space. If the space cannot be allocated, a
>> null pointer is
>> returned. If the size of the space requested is zero, the behavior is
>> implementationdefined:
>> either a null pointer is returned, or the behavior is as if the size
>> were some
>> nonzero value, except that the returned pointer shall not be used to
>> access an object.
>>
>> ...
>>
>> 7.20.3.4 The realloc function
>> ...
>> 3 If ptr is a null pointer, the realloc function behaves like the
>> malloc function for the
>> specified size

> Oops, that section is irrelevant...
>
>> So it surely seems implementation defined to me.

> But from the 1st section I think this still holds true

Esp. as the section Walter quoted isn't in n1256 (anymore?)

Bye, Jojo


 
Reply With Quote
 
Harald van Dijk
Guest
Posts: n/a
 
      03-06-2008
On Thu, 06 Mar 2008 18:03:02 +0000, Walter Roberson wrote:
> In article
> <(E-Mail Removed)>,
> Francois Grieu <(E-Mail Removed)> wrote:
>>When running the following code under MinGW, I get realloc(p,0) returned
>>NULL
>>Is that a non-conformance?

>
> No, it is conformance, and returning non-NULL would be non-conformance.
>
> [C89 citation snipped]


While you're not at all wrong, please keep in mind that this is one of the
areas in which C99 differs from the previous standard. In C99, it's
unspecified whether realloc(p, 0) returns a null pointer, but if it
returns a null pointer, then p is *not* freed.
 
Reply With Quote
 
Joachim Schmitz
Guest
Posts: n/a
 
      03-06-2008
Harald van D?k wrote:
> On Thu, 06 Mar 2008 18:03:02 +0000, Walter Roberson wrote:
>> In article
>> <(E-Mail Removed)>,
>> Francois Grieu <(E-Mail Removed)> wrote:
>>> When running the following code under MinGW, I get realloc(p,0)
>>> returned NULL
>>> Is that a non-conformance?

>>
>> No, it is conformance, and returning non-NULL would be
>> non-conformance.
>>
>> [C89 citation snipped]

>
> While you're not at all wrong, please keep in mind that this is one
> of the areas in which C99 differs from the previous standard. In C99,
> it's unspecified whether realloc(p, 0) returns a null pointer, but if
> it returns a null pointer, then p is *not* freed.

I don't read it mlike this

The realloc function returns a pointer to the new object (which may have the
same
value as a pointer to the old object), or a null pointer if the new object
could not be
allocated.

allocating 0 bytes can't be too difficult , so no compelling reason to
return NULL

Bye, Jojo



 
Reply With Quote
 
Walter Roberson
Guest
Posts: n/a
 
      03-06-2008
In article <da591$47d036a0$541dfcd3$(E-Mail Removed)1.nb.ho me.nl>,
Harald van =?UTF-8?b?RMSzaw==?= <(E-Mail Removed)> wrote:
>On Thu, 06 Mar 2008 18:03:02 +0000, Walter Roberson wrote:
>> In article
>> <(E-Mail Removed)>,
>> Francois Grieu <(E-Mail Removed)> wrote:
>>>When running the following code under MinGW, I get realloc(p,0) returned
>>>NULL
>>>Is that a non-conformance?


>> No, it is conformance, and returning non-NULL would be non-conformance.


>> [C89 citation snipped]


>While you're not at all wrong, please keep in mind that this is one of the
>areas in which C99 differs from the previous standard. In C99, it's
>unspecified whether realloc(p, 0) returns a null pointer, but if it
>returns a null pointer, then p is *not* freed.


Good point -- but as best I -recall- MinGW is not C99.

--
"Beware of bugs in the above code; I have only proved it correct,
not tried it." -- Donald Knuth
 
Reply With Quote
 
Francois Grieu
Guest
Posts: n/a
 
      03-06-2008
On Mar 6, 7:03 pm, (E-Mail Removed)-cnrc.gc.ca (Walter Roberson)
wrote:
> Francois Grieu <(E-Mail Removed)> wrote:
>
>> When running the following code under MinGW, I get
>> realloc(p,0) returned NULL
>> Is that a non-conformance?

>
> No, it is conformance, and returning non-NULL would be non-conformance.


I disagree (at least) about the second member of that answer under
C99. IMHO realloc(p,0) is allowed to return the same thing as
malloc(0), which is not required to return NULL.

I reason that when p is a valid non-NULL pointer to a pointer returned
by malloc() and memory is aplenty, realloc(p,0) must return a pointer
to a new object that has the size 0, which is the same thing a what
malloc(0) should return, which is not required to be NULL, and is not
NULL in many implementations, including that one I'm strugling with.

> C89 4.10.3.4 The realloc Function
>
> If size is zero and ptr is not a null pointer, the object
> it points to is freed.
>
> Returns
>
> The realloc function returns either a null pointer or a
> pointer to the possibly moved allocated space.
>
> In the case of zero as the size, there is no more allocated space
> (because zero size requires freeing), so the other branch of the
> 'either' kicks in, requiring realloc to return a null pointer
> for this case.



C99 says {
void *realloc(void *ptr, size_t size);

The realloc function deallocates the old object pointed to by ptr and
returns a pointer to a new object that has the size specified by size.
The contents of the new object shall be the same as that of the old
object prior to deallocation, up to the lesser of the new and old
sizes. Any bytes in the new object beyond the size of the old object
have indeterminate values.

If ptr is a null pointer, the realloc function behaves like the malloc
function for the specified size. Otherwise, if ptr does not match a
pointer earlier returned by the calloc, malloc, or realloc function,
or if the space has been deallocated by a call to the free or realloc
function, the behavior is undefined. If memory for the new object
cannot be allocated, the old object is not deallocated and its value
is unchanged.

The realloc function returns a pointer to the new object (which may
have the same value as a pointer to the old object), or a null pointer
if the new object could not be allocated.
}




I get the same result "realloc(p,0) returned NULL" with the source
changed to the deeper test:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
void *p = malloc(1);
if (p==NULL)
puts("Memory is very low"); // does not occur
if (malloc(0)==NULL)
puts("malloc(0) returned NULL"); // does not occur
if (realloc(NULL,0)==NULL)
puts("realloc(NULL,0) returned NULL"); // does not occur
if (realloc(p,0)==NULL)
puts("realloc(p,0) returned NULL"); // occurs ?!
if (malloc(10000)==NULL)
puts("Memory was rather low"); // does not occur
}


So I get an implementation of realloc(ptr,0) that turns a NULL ptr to
a non-NULL result, and non-NULL ptr to NULL result; which is at the
very least a surprise, non-orthogonal, and error-prone. In my case a
perfectly sound-looking "read the whole file in memory, in several
chuncks as necessary" function failed for an empty file, claiming
there is no memory.

Francois Grieu
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Why use "return (null);" instead of "return null;" ? Carl Java 21 08-24-2006 04:33 AM
"stringObj == null" vs "stringObj.equals(null)", for null check?? qazmlp1209@rediffmail.com Java 5 03-29-2006 10:37 PM
Can't return null byte with Response.BinaryWrite Vitaly Sedov ASP .Net 0 02-14-2006 10:08 AM
what value does lack of return or empty "return;" return Greenhorn C Programming 15 03-06-2005 08:19 PM
How I free memory and return value from that memory area? sam C++ 2 06-27-2003 01:29 PM



Advertisments