Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   sizeof() O/P (http://www.velocityreviews.com/forums/t440642-sizeof-o-p.html)

raghu 12-24-2005 01:29 PM

sizeof() O/P
 
i'm surprised at the output of the following code. compiled in turbo C

void main()
{
printf("%d",sizeof(printf());
}
the output was : 2
how come the output is 2? actually what is the property of sizeof()
and printf()?are there any return types for the two functions? hoping
for the positive responses.. thanks a lot in advance.


Chris Hills 12-24-2005 01:48 PM

Re: sizeof() O/P
 
In article <1135430966.150072.313300@f14g2000cwb.googlegroups .com>,
raghu <raghujindia@gmail.com> writes
>i'm surprised at the output of the following code. compiled in turbo C
>
>void main()
>{
>printf("%d",sizeof(printf());
>}
>the output was : 2
>how come the output is 2? actually what is the property of sizeof()
>and printf()?are there any return types for the two functions? hoping
>for the positive responses.. thanks a lot in advance.


Ignoring that it should have been

#include <stdio.h>
int main(void)
{
printf("%d",sizeof(printf());
return 0;
}

Who set this home work?


--
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
\/\/\/\/\ Chris Hills Staffs England /\/\/\/\/
/\/\/ chris@phaedsys.org www.phaedsys.org \/\/\
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/




Richard Heathfield 12-24-2005 01:49 PM

Re: sizeof() O/P
 
raghu said:

> i'm surprised at the output of the following code. compiled in turbo C
>
> void main()


Don't be. Any program which gives the wrong return type for main() exhibits
undefined behaviour, so any behaviour, surprising or not, is permissible as
far as the C language is concerned.

> {
> printf("%d",sizeof(printf());


Calling printf without a correct prototype in scope invokes undefined
behaviour. Calling printf without any arguments invokes undefined
behaviour.

Start your program like this:

#include <stdio.h>

int main(void)

....and then try your program again, first fixing any diagnostics issued by
your compiler.


--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)

Richard Heathfield 12-24-2005 01:54 PM

Re: sizeof() O/P
 
Chris Hills said:

> In article <1135430966.150072.313300@f14g2000cwb.googlegroups .com>,
> raghu <raghujindia@gmail.com> writes
>>i'm surprised at the output of the following code. compiled in turbo C
>>
>>void main()
>>{
>>printf("%d",sizeof(printf());
>>}
>>the output was : 2
>>how come the output is 2? actually what is the property of sizeof()
>>and printf()?are there any return types for the two functions? hoping
>>for the positive responses.. thanks a lot in advance.

>
> Ignoring that it should have been
>
> #include <stdio.h>
> int main(void)
> {
> printf("%d",sizeof(printf());


No, %d doesn't match size_t.

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)

Richard Heathfield 12-24-2005 01:57 PM

Re: sizeof() O/P
 
Richard Heathfield said:

> raghu said:
>
>> printf("%d",sizeof(printf());

>
> Calling printf without a correct prototype in scope invokes undefined
> behaviour. Calling printf without any arguments invokes undefined
> behaviour.


Except, of course, that the code doesn't actually call printf without any
arguments! Sorry about that. But the rest of my reply stands.

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)

Eric Sosman 12-24-2005 01:57 PM

Re: sizeof() O/P
 
raghu wrote:
> i'm surprised at the output of the following code. compiled in turbo C
>
> void main()
> {
> printf("%d",sizeof(printf());
> }
> the output was : 2
> how come the output is 2? actually what is the property of sizeof()
> and printf()?are there any return types for the two functions? hoping
> for the positive responses.. thanks a lot in advance.


There should be no cause for surprise, no matter what
output is or is not produced. You should not be surprised
if the code makes demons fly out of your nose, because it
invokes undefined behavior not once, not twice, but thrice:

- The main() function is not `void'

- It is U.B. to call a variadic function like printf()
without a prototype in scope

- It is U.B. to pass a non-`int' to the "%d" specifier
(On some "exotic" systems where `size_t' is narrower
than `int' this might be all right, so I really should
say that whether the behavior is defined or undefined
is implementation-defined.)

.... and on top of all that, the fate of a newline-less "line"
at the end of a stream of output is implementation-defined.

(Three instances of U.B. and one of I.D.B., or possibly
two U.B. and two I.D.B. -- all in just four lines, two of
which consist only of braces. Is this density of errors --
a density of densness, one might say -- a candidate for the
Guinness Book? Sadly, I fear not.)

Here's a cleaned-up version:

#include <stdio.h> /* for printf() prototype */
int main(void) {
printf ("%d\n", /* note newline */
(int)sizeof printf()); /* note type coercion */
return 0; /* required in C90, optional in C99 */
}

Now, you may still be puzzled about the output of the
cleaned-up version of your bletcherous code. Much will become
clearer if you ponder two questions:

- What does the `sizeof' operator do with its argument?

- What type does the printf() function return?

Answer these, Grasshopper, and you will be on the path
to enlightenment -- but if you keep on writing code like the
sample you provided here, it means you're on the right path
but walking in the wrong direction.

--
Eric Sosman
esosman@acm-dot-org.invalid

Emmanuel Delahaye 12-24-2005 02:18 PM

Re: sizeof() O/P
 
raghu a écrit :
> i'm surprised at the output of the following code. compiled in turbo C
>
> void main()
> {
> printf("%d",sizeof(printf());
> }


This code invokes an undefined behaviour

- The type returned by main() is int.
- An explicit valid value must be returned.
"%d" expects an int and the sizeof operator returns a size_t.

> the output was : 2


Supposing the code was fixed, this 2 is the size of the type returned by
printf (actually int) on your machine.

> how come the output is 2? actually what is the property of sizeof()


Like your C-book said, the sizeof operator return the size of an object
or of a type (with parens) in number of bytes. The type of the returned
value is size_t.

> and printf()?


printf() is a function returning int. Details belong to your C-book.

> are there any return types for the two functions?


sizeof is not a function but a C-unary-operator
--
A+

Emmanuel Delahaye

Chris Hills 12-24-2005 03:14 PM

Re: sizeof() O/P
 
In article <dojjl4$qeo$1@nwrdmz01.dmz.ncs.ea.ibs-infra.bt.com>, Richard
Heathfield <invalid@invalid.invalid> writes
>raghu said:
>
>> i'm surprised at the output of the following code. compiled in turbo C
>>
>> void main()

>
>Don't be. Any program which gives the wrong return type for main() exhibits
>undefined behaviour, so any behaviour, surprising or not, is permissible as
>far as the C language is concerned.


void main (void) *may* be permissible with turbo C as I think it could
turn out code that would run with out an OS. Somewhere I have a ROM
kit for Turbo-C.

In general (ie unless explicitly specified as self hosted) it MUST be
int main ([args])


>
>> {
>> printf("%d",sizeof(printf());

>
>Calling printf without a correct prototype in scope invokes undefined
>behaviour. Calling printf without any arguments invokes undefined
>behaviour.
>
>Start your program like this:
>
>#include <stdio.h>
>
>int main(void)
>
>...and then try your program again, first fixing any diagnostics issued by
>your compiler.
>
>


--
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
\/\/\/\/\ Chris Hills Staffs England /\/\/\/\/
/\/\/ chris@phaedsys.org www.phaedsys.org \/\/\
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/




Giannis Papadopoulos 12-24-2005 03:42 PM

Re: sizeof() O/P
 
Eric Sosman wrote:
> raghu wrote:
>
>> i'm surprised at the output of the following code. compiled in turbo C
>>
>> void main()
>> {
>> printf("%d",sizeof(printf());
>> }
>> the output was : 2
>> how come the output is 2? actually what is the property of sizeof()
>> and printf()?are there any return types for the two functions? hoping
>> for the positive responses.. thanks a lot in advance.

>
> ...
> ...
> Here's a cleaned-up version:
>
> #include <stdio.h> /* for printf() prototype */
> int main(void) {
> printf ("%d\n", /* note newline */
> (int)sizeof printf()); /* note type coercion */
> return 0; /* required in C90, optional in C99 */
> }


Well, this does not compile on gcc given -ansi -pedantic.
Perhaps printf("") instead of printf() would be better?

Martin Ambuhl 12-24-2005 05:46 PM

Re: sizeof() O/P
 
raghu wrote:
> i'm surprised at the output of the following code. compiled in turbo C
>
> void main()
> {
> printf("%d",sizeof(printf());
> }
> the output was : 2
> how come the output is 2?


Since you define main to have an invalid return type (main returns an
int) and leave out the declaration of printf (corrected by including
<stdio.h>), and fail to terminate the last line of output with an
end-of-line character, any action this program performs is completely
random.


All times are GMT. The time now is 01:37 PM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57