malloc() and implicit cast

A

arnuld

I have checked the FAQ: http://c-faq.com/malloc/mallocnocast.html


FAQ discusses a special case when programmer has forgotten to do
#include <stdlib.h>. I am including this header and I am not doing any
explicit cast:



#include <stdlib.h>


enum ARRSIZE { MAXSIZE = 100 };


struct dummy
{
int i;
};


int main( void )
{

char *pc;
struct dummy *ptrDummy;

pc = malloc( MAXSIZE );
ptrDummy=malloc(sizeof(struct dummy));

return 0;
}

============ OUTPUT ============
/home/arnuld/programs/C $ gcc -ansi -pedantic -Wall -Wextra test.c
/home/arnuld/programs/C $ ./a.out
/home/arnuld/programs/C $



malloc(size_t n) returns a void pointer and here in my program, I am
assigning malloc returned pointers to 2 different types and I am not
getting any warnings about <implicit cast>.


It has something to do with C90 ?
 
S

Stephen Sprunk

arnuld said:
I have checked the FAQ: http://c-faq.com/malloc/mallocnocast.html

FAQ discusses a special case when programmer has forgotten to do
#include <stdlib.h>. I am including this header and I am not doing any
explicit cast:

There is no such thing as an "explicit cast". There are implicit and
explicit conversions; the latter uses a cast, and the former does not.
#include <stdlib.h> ....
char *pc;
struct dummy *ptrDummy;

pc = malloc( MAXSIZE );
ptrDummy=malloc(sizeof(struct dummy)); ....
malloc(size_t n) returns a void pointer and here in my program, I am
assigning malloc returned pointers to 2 different types and I am not
getting any warnings about <implicit cast>.

There is no such thing as an "implicit cast". There are implicit and
explicit conversions; the latter uses a cast, and the former does not.

Second, a warning is only expected when you _don't_ include the proper
header and you _don't_ use a cast. Since you're including the proper
header, there is no reason for a warning.

What's the problem?

S
 
P

Peter Nilsson

I _really_ read the FAQ and took notice of the parenthetical
comment at the end. It highlights that the real issue lies
with using unprototyped functions. Sensible programmers
will use compilers that advise of such things. [Of course,
conforming C90 compilers are not required to issue
diagnostics, but nevertheless the issue has been around
long enough that you'll be hard pressed to find any
conforming compiler that isn't capable of alerting you
to the use of an unprototyped function. Personally, I
think a C programmer be insane not to use that feature
if it was available.]
To and from other object pointer type. There is no
defined conversion between pointers to functions and
pointers to object types, even incomplete object types
like void.

Except for the case of null pointer constants.
 
P

Peter Nilsson

arnuld said:
so an int* is implicitly converted to a void*

What int*?
which then can be implicitly converted to char* without any
warning at all.

Consider...

int *ip = malloc(N * sizeof *ip);

The malloc function knows nothing about the type being allocated.
It returns a void * to a region suitably aligned for any object.

There is an implicit conversion from void * to int * in the assignment
of the void * to ip, but as you say there is (generally) no warning.
Nor should you expect there to be one. The implicit conversion of
void * to and from other object or incomplete types is a language
_feature_. [Not necessarily a good one, but a deliberate feature
nonetheless.]
 
P

Peter Nilsson

Richard said:
...A pointer to function, of no matter what return type, cannot
be implicitly converted into *any* other type, let alone a char *.

Actually, they can be implicitily converted in limited cases...

int main(int argc, char **argv)
{
int (*fp)() = main; /* okay */
return 0;
}
 
A

arnuld

To and from other object pointer type. There is no defined conversion
between pointers to functions and pointers to object types, even
incomplete object types like void.

so an int* is implicitly converted to a void* which then can be
implicitly converted to char* without any warning at all.
 
A

arnuld

To and from other object pointer type. There is no defined conversion
between pointers to functions and pointers to object types, even
incomplete object types like void.

so I conlcude:

1.) Function Pointers: pointer to function returning an int can be
implicitly converted into char* without any any warning message.

2.) Pointers to object types: compiler can implicitly convert and int*
into char* without any warning message to the programmer. C doe snot
require any warning in this case



Is that what you mean ?
 
A

Antoninus Twink

In the particular case of thing* to or from char* it's
not ipso facto an error: C specifically permits accessing
an object's representation as an array of char.

A better example might be double* to void* to int*,
which is either an error or at best a dubious practice.

I don't see why isn't necessarily dubious. Portability isn't everything,
and in speed-critical sections of code, using bit-twiddling to
manipulate floating-point numbers can be a very valuable practice.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,071
Latest member
MetabolicSolutionsKeto

Latest Threads

Top