Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #5392

Re: Questions Regarding Null and Casting

From Keith Thompson <kst-u@mib.org>
Newsgroups comp.lang.c
Subject Re: Questions Regarding Null and Casting
Date 2011-06-03 15:25 -0700
Organization None to speak of
Message-ID <lntyc6imc4.fsf@nuthaus.mib.org> (permalink)
References <isbl3d$lvh$1@speranza.aioe.org>

Show all headers | View raw


BigChuck19 <bc19@mailinator.com> writes:
> My textbook asserts that when checking if sufficient memory was
> allocated for a dynamic variable using malloc(), a test should be made
> to determine whether sufficient memory was actually allocated.  I
> understand the concept of checking if the memory was allocated; the
> code confuses me, however.  E.g., a fragment of code from the book is:
>
> grades = (int *) malloc(numgrades * sizeof(int));
> if (grades == (int *) NULL) {
>    printf("Failed to allocate grades array");
>    exit(1);
>
> }

This is rather poor code.  I presume that grades is declared as:
    int *grades;
which should have been shown along with the fragment.

Both casts are unnecessary, and can hide errors.  For an explation, see
section 7 of the comp.lang.c FAQ, <http://www.c-faq.com/>.

Rather than enumerating each problem (I see nearly one per line),
here's how I'd write it:

    grades = malloc(numrades * sizeof *grades);
    if (grades == NULL) {
        fprintf(stderr, "Failed to allocate grades array\n");
        exit(EXIT_FAILURE);
    }

> My question concerns the use of the cast (int *).  The book states
> that one must write " if (grades == (int *) NULL) " because if there
> is insufficient memory available, malloc() returns NULL, which is then
> cast into a pointer to an integer by the (int *) preceding the call to
> malloc().

The cast is an explicit conversion.  It's unnecessary because the value
of NULL will be implicitly converted to the type of grades (int*) before
it's compared.

It's more accurate to say that malloc() returns a null pointer.  NULL
is a macro that expands to a "null pointer constant".

>            I do not understand how NULL can be cast into anything,
> though, since I thought NULL was the constant 0, or I guess its value
> is the constant 0.

NULL expands to a null pointer constant.  It could be just a literal 0,
or the expression ((void*)0), or any of a number of other possibilities.
You don't need to care exactly what it expands to, just that evaluating
it *in a pointer context* yields a null pointer value.

>                     To check if malloc() returns NULL or not, why
> couldn't one write " if (grades == NULL) ".

You can and should.

>                                              I guess the answer is
> that you can't write that because NULL was cast as a pointer to an
> integer in the previous statement.  But what does it matter which data
> type NULL points to, as long as you determine that the address stored
> in grades is NULL?

The type of any pointer expression does matter a great deal.  But in
this case, there's a special-case rule that says a null pointer constant
will be implicitly converted to an appropriate pointer type.

> The use of a cast on NULL raises a few more questions.  Say I create a
> character array called array.  After initializing all its entries, I
> then want to clear the entire array by making each entry hold the null
> character.  I could write something like the following to accomplish
> this:
>
> for(i = 0; i < MAXTENTRIES; i++)
>     array[i] = '\0';

Ok.

> Does the following loop perform the identical operation?
>
> for(i = 0; i < MAXENTRIES; i++)
>    array[i] = (char) NULL;

It might, depending on how your implementation chooses to define NULL,
but it's a really bad idea.  NULL should be used *only* when you want a
null pointer value.  A null character is a very different thing.

(Unfortunately, on most systems the compiler won't warn you about
"(char) NULL".

> And I assume if the preceding code is valid, then one can cast NULL as
> any data type; for instance,
>
> for(i = 0; i < MAXENTRIES; i++)
>    array[i] = (int) NULL;
>
> would assign each entry the value of zero?

Don't do this either; see above.

> I am confused about the definition of NULL and the use of NULL; is it
> only used when using pointers?  I am not sure, since the use of a cast
> on NULL seems to indicate that one can make NULL any data type.

Yes, it should be only used when you want a null pointer value.

Most casts are unnecessary, since C provides implicit conversions for
most of the cases where you need one.

> My final question concerns the use of NULL with a structure.  If I
> define a structure, say,
>
> typedef struct house {
>    int floors;
>    char owner[MAXSIZE];
>
> } House;
>
> and then declare h to be a variable of type house
>
> House h;
>
> Now does
>
> h = (House) NULL;
>
> have any meaning??  If so, what does the statement do?

No, it has no meaning at all.  It's not legal to cast to a struct
type -- and it wouldn't make any sense to convert NULL to a struct
type anyway.

Incidentally, your original article was very difficult to read.  It looks
like you wrote it with fairly long lines, and something split each
line into two parts, resulting in alternating long and short lines
by the time I saw it.  Keep each line in a posted article down to
70 or 72 columns.

-- 
Keith Thompson (The_Other_Keith) kst-u@mib.org  <http://www.ghoti.net/~kst>
Nokia
"We must do something.  This is something.  Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Questions Regarding Null and Casting BigChuck19 <bc19@mailinator.com> - 2011-06-03 21:52 +0000
  Re: Questions Regarding Null and Casting Ian Collins <ian-news@hotmail.com> - 2011-06-04 10:13 +1200
    Re: Questions Regarding Null and Casting Ian Collins <ian-news@hotmail.com> - 2011-06-04 10:16 +1200
  Re: Questions Regarding Null and Casting Keith Thompson <kst-u@mib.org> - 2011-06-03 15:25 -0700
    Re: Questions Regarding Null and Casting Tim Rentsch <txr@alumni.caltech.edu> - 2011-06-03 20:45 -0700
  Re: Questions Regarding Null and Casting pete <pfiland@mindspring.com> - 2011-06-03 18:38 -0400
  Re: Questions Regarding Null and Casting Angel <angel+news@spamcop.net> - 2011-06-03 23:23 +0000
    Re: Questions Regarding Null and Casting Keith Thompson <kst-u@mib.org> - 2011-06-03 17:24 -0700
  Re: Questions Regarding Null and Casting "J. J. Farrell" <jjf@bcs.org.uk> - 2011-06-04 00:45 +0100
  Re: Questions Regarding Null and Casting Keith Thompson <kst-u@mib.org> - 2011-06-03 17:27 -0700
  Re: Questions Regarding Null and Casting pete <pfiland@mindspring.com> - 2011-06-03 21:12 -0400
  Re: Questions Regarding Null and Casting Shao Miller <sha0.miller@gmail.com> - 2011-06-06 20:11 -0500

csiph-web