[comp.lang.c] Need help with structure pointers

tad@killer.UUCP (Tad Marko) (10/10/87)

I've never bothered to get a complete grasp over structures before, and
now it is hurting me.  Could someone please tell me the proper way to
accomplish the following ugliness?

-----------------
struct X {
    char *s;
    int a, b;
};
 
 
main()
{
    struct X x;
    struct X *sp;
    char max[25];
 
    sp = &x;
 
    sp.s = max;
    strcpy(x.s, "Some Stuff");
    fun(&x);
}
 
fun(stuff)
struct X *stuff;
{
    stuff->*(++s) = 'X';
    printf("%s\n", stuff.s); /* I want this to print "Xme Stuff" */
}

===============================================================================
	   Tad Marko at UNIX Connection BBS AT&T 3B2, Dallas, Texas
	     North Texas State University ACM C/UNIX SIG Chairman

Snail:				UUCP:	ihnp4!killer!tad
2829 Sagebrush Drive		or	ihnp4!convex!ntvax!tad
Flower Mound, Texas 75028-2721	BitNet: IG45@NTSUVAX
214-539-0080  214-539-7776	TEXNET: NTVAXB::IG45
"Hi there!" -- Peter Gabriel    InterN: IG45%NTVAXB.DECNET@UTADNX.CC.UTEXAS.EDU

edw@ius1.cs.cmu.edu (Eddie Wyatt) (10/11/87)

In article <1778@killer.UUCP>, tad@killer.UUCP (Tad Marko) writes:
> I've never bothered to get a complete grasp over structures before, and
> now it is hurting me.  Could someone please tell me the proper way to
> accomplish the following ugliness?
> 
> -----------------

Corrected program to follow:

struct X {
    char *s;
    int a, b;
};


main()
{
    struct X x;
    struct X *sp;
    char max[25];

    sp = &x;
 
        /* 
    sp.s = max;
        */ 
    sp->s = max;
    strcpy(x.s, "Some Stuff");
    fun(&x);
}
 
fun(stuff)
struct X *stuff;
{
        /*
    stuff->*(++s) = 'X';
        */
    *(++stuff->s) = 'X';
    printf("%s\n", stuff->s); /* I want this to print "Xme Stuff" */
}
-- 

					Eddie Wyatt

e-mail: edw@ius1.cs.cmu.edu

ron@topaz.rutgers.edu (Ron Natalie) (10/11/87)

The line

    stuff->*(++s) = 'X';

Should read
    *++stuff->s = 'X';

The only thing that can follow "->" (or ".") for that matter are
element names.  "stuff->s" is the character pointer in the structure
pointed to by stuff.  "->" binds tighter than everything else in the
expression.

-Ron

rwhite@nusdhub.UUCP (Robert C. White Jr.) (10/13/87)

In article <1778@killer.UUCP>, tad@killer.UUCP (Tad Marko) writes:

	The only problem I saw in you posted program is that when
you have a pointer to a structure you were not de-refrenceing the
pointer before reaching for the value.

	You need something like (*structname).fieldname to do this.
The shorthand for this is the -> operator, therefore where sp and
stuff were defined as "struct X *sp, *stuff" you need to change the
lines as follows:

>     sp.s = max;
      sp->s = max;
>     printf("%s\n", stuff.s); /* I want this to print "Xme Stuff" */
      printf("%s\n", stuff->s); /* I want this to print "Xme Stuff" */

Disclaimer: o-god-please-don't-let-me-be-wrong....

Robert.

leather@osiris.cso.uiuc.edu (10/13/87)

> /* Written 11:39 pm  Oct  9, 1987 by tad@killer.UUCP 
> /* ---------- "Need help with structure pointers" ---------- */
> I've never bothered to get a complete grasp over structures before, and
> now it is hurting me.  Could someone please tell me the proper way to
> accomplish the following ugliness?
> 
> pgrogram deleted for ugliness ... |-)
>

      A very important distinction to remember is the difference between:
        - the structure member  operator "." and
        - the structure pointer operator "->"

      The member operator works with the name of a structure:
          x.s = 'X';

      The pointer operator works with the pointer to a structure:
          sp->s = 'X';

      You must also be very careful of how you de-reference your pointers
      (ie. how you access the data for which you have the pointer).
          *++(stuff->s) = 'X';

      Personally, I try not to mix the two operations; but, to each his own.
      "The C Programming Language" by Brian W. Kernighan & Dennis M. Ritchie
      treats the subject in depth.  Get a copy and read it (Chapter 6).



UNTIL THEN -
   TRY THIS:  (I only made it work; making it aesthetically pleasing is a 
               matter of taste &/or programming style, which I choose not
               to dig into here)

struct X {char *s;
          int   a, b;
         };
 
main()
{struct X x;
 struct X *sp;
 char   max[25];
 
 sp    = &x;
 sp->s = max;
 strcpy(x.s, "Some Stuff");
 fun(&x);
}
 
fun(stuff)
struct X *stuff;
{
 *++(stuff->s) = 'X';
 printf("%s\n", stuff->s); /* I want this to print "Xme Stuff" */
}

			Good Luck - Dave L.