Pointer Problems

Colin Plumb colin at array.UUCP
Tue Aug 21 08:03:33 AEST 1990


In article <UamezZm00WB0EGzUo0 at andrew.cmu.edu> gh1r+ at andrew.cmu.edu (Gaurang Hirpara) writes:
> I got a variety of solutions, but perhaps I didn't state the problem clearly.
> The form ((StructName *)Something)->x=100 works. 
> However, the format I need is this type:
>
> TopLevel->Secondary->Something->x=100;
>
> i.e. I can't do the casting in the middle of the dereference. It won't let
> me no matter which way I do it. Toplevel contains a pointer to
> Secondary, which contains Something. Something initially points to a
> void *. 

The way you've described it in english:
Toplevel points to Secondary, a structure.  (i.e. Toplevel = &Secondary)
Something is a field of Secondary. (i.e. Secondary.Something is legal)
Something is a pointer to a pointer to void. (i.e.  void ** Something)
StructName is a typedef for a structure with a field x, with numeric type.
You want to assign that field the value 100.

So you with to cast that void ** to a StructName *.
Easily done:
((StructName *)Toplevel->Something)->x = 100;

> I want to be able to make it point to, say a struct StructName which has 
> as one of its elements x, and be able to change that element. However,
> if I allocate space for Something by casting to StructName, it still has
> problems getting to x. 

I don't quite follow.  Given the above and
StructName foo;
you can do:
Toplevel->Something = (void **)&foo;
((StructName *)Toplevel->Something)->x = 100;

>Hope this makes the problem clearer.

Except for the fact that your sample code,
Toplevel->Secondary->Something->x = 100;
doesn't match the english.  This has the structure
Toplevel is a pointer to a structure, with a field "Secondary".
Toplevel->Secondary is a pointer to a strucutre with a field Something.
Toplevel->Secondary->Something is a pointer to a strucutre with a field x.
Toplevel->Secondary->Something->x is a numeric variable of some sort.

Now, if Toplevel->Secondary->Something is actually a void * (generaic
pointer), and the structure which contains x is "StructType" then you'd
cast it like so:
((struct SomeType *)Toplevel->Secondary->Something)->x = 100;

Does that clear things up?
-- 
	-Colin



More information about the Comp.lang.c mailing list