p=(char *)malloc((sizeof(float))["\000\006\010\013\015\100"])

M

MisterE

Is that sufficiently simple for you? (Remember to replace 11 with a
different
value from the array if sizeof(float) doesn't happen to be 3 on your
system.)

Does something like this have a legitimate use at all?
 
C

Chris Dollin

MisterE said:
Does something like this have a legitimate use at all?

/Something/ like this, yes, depending on how close a similarity
you insist on. `malloc` is, after all, a useful function.
 
Ø

Øyvind Røtvold

MisterE said:
Does something like this have a legitimate use at all?

This may save you a couple of bytes.

Making it more readable by placing the table as a static before the
call would probably not cost you any bytes, this would, however only
work if this is used where you can have declarations, otherwise eg. in
a macro, this may be a solution.

The numbers look odd though, appearently only size 1 to 4 produces
sensible values, what's the context here?
 
R

rahul

fuzhen said:
what's this?

Checking the subject line, I guess you are referring to this:

p=(char *)malloc((sizeof(float))["\000\006\010\013\015\100"])

to which the answer is that it's a badly written call to malloc. But, given
suitable furniture (a function wrapped around it, <stdlib.h>, etc - and a
semicolon wouldn't go amiss at the end there), it's perfectly legal, provided
sizeof(float) doesn't exceed 6 on the target system. On systems where it
does, the behaviour is undefined.

Let's start off by assuming sizeof(float) is 3 - which is a perfectly legal
value for sizeof(float), and has the merit of being a little unlikely, to say
the least.

Thus, given that assumption, the code reduces to:

p=(char *)malloc((3)["\000\006\010\013\015\100"])

and (3) is just 3, so that gives us:

p=(char *)malloc(3["\000\006\010\013\015\100"])

Now, a and *(a + i) are guaranteed to be equivalent, so let's do some
substituting:

p=(char *)malloc(*(3+"\000\006\010\013\015\100"))

Okay, x+y is the same as y+x, so:

p=(char *)malloc(*("\000\006\010\013\015\100"+3))

and *(a + i) is the same as a, so:

p=(char *)malloc("\000\006\010\013\015\100"[3])

Now, "\000\006\010\013\015\100" is an array with values { 0, 6, 8, 11, 13, 64,
0 }, so "\000\006\010\013\015\100"[3] is element 3 of that array: element 0
is 0, element 1 is 6, element 2 is 8, element 3 is 11. So we can substitute
that back in again:

p=(char *)malloc(11)

and finally we can lose the spurious and utterly pointless cast, which gives:

p = malloc(11)

Is that sufficiently simple for you? (Remember to replace 11 with a different
value from the array if sizeof(float) doesn't happen to be 3 on your system.)

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -http://www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999


This is the first time I am seeing array literals declared in this
manner. This is a new addition in C99, isn't it? And this cryptic
thing is supposed to pass array literals ( just to quote one of the
possible scenarios).
 
P

Peter Nilsson

rahul said:
Richard Heathfield said:
Checking the subject line, I guess you are referring to this:

p=(char *)malloc((sizeof(float))["\000\006\010\013\015\100"])
This is the first time I am seeing array literals declared in this
manner. This is a new addition in C99, isn't it?

No. Neither string literals nor a == i[a] is new.
 
R

rahul

rahul said:
Richard Heathfield said:
Checking the subject line, I guess you are referring to this:
p=(char *)malloc((sizeof(float))["\000\006\010\013\015\100"])
This is the first time I am seeing array literals declared in this
manner. This is a new addition in C99, isn't it?

No. Neither string literals nor a == i[a] is new.


Thanks Peter,
I missed that part in the FAQ. I got my answer.
char *a = "hello";
printf ("%c", 2[a]);
The above snippet directly does
printf ("%c", 2["hello"]);

a == i[a]. Hey...I knew that
 

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

Members online

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,173
Latest member
GeraldReund
Top