Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!usc!elroy.jpl.nasa.gov!jato!jdickson From: jdickson@jato.jpl.nasa.gov (Jeff Dickson) Newsgroups: comp.sys.amiga.programmer Subject: Re: Is this valid C? Message-ID: <1991May16.215720.11051@jato.jpl.nasa.gov> Date: 16 May 91 21:57:20 GMT References: <53200@nigel.ee.udel.edu> <38763@ditka.Chicago.COM> <635@lysator.liu.se> Reply-To: jdickson@jato.Jpl.Nasa.Gov (Jeff Dickson) Organization: Jet Propulsion Laboratory, Pasadena, CA Lines: 53 In article <635@lysator.liu.se> zap@lysator.liu.se (Zap Andersson) writes: >comeau@ditka.Chicago.COM (Greg Comeau) writes: > >>In article <53200@nigel.ee.udel.edu> lawsonse@vttcf.cc.vt.edu (Shannon Lawson) writes: >>>> In article <616@lysator.liu.se> zap@lysator.liu.se (Zap Andersson) writes: >>>> >struct foop *p; struct foop { int a; char *b }; >>>> > >main() { p->a = 39; /* Will complier barf here? */ } >>>> > There will be a no barf since at the ->a, foop is no longer an incomplete >>>> > type. It is not a problem. >>>I disagree. p is a pointer to foop, and has not been allocated a foop to which >>>it may point. Depending on the compiler, p points to some random location, so >>>you are happily sticking the value 39 into some nebulous area. Although your >>>syntax is correct (and the compiler may not gag), you should see a problem >>>at runtime when you try to reference p. > >>Please do not compare apples to oranges. > >>The original posting dealt strictly wiht the accessibility of p/a and >>hence it was answered in that context. > >Yes, and I don't know how it got there since I wrote it - and I had TWO >pices of code in it. In ONE of them I explicitly wrote malloc(sizeof(foo)) >just to SHOW people that that wasn't the point. I seem to have forgottn >that in the last example - sorry - but that was NOT the point at ALL, ok? > >The point was: If you say: > >struct kevlar_oysters *ipp; /* Wich is valid EVEN IF kevlar_oysters are un- > known as this time: ipp is a pointer to an > 'unknown' structure */ > >and AFTER that you do: > >struct kevlar_oysters { int foo; float bar; }; > >Now the structure TYPE itself is known - however, is a compiler >sufficiently intellegent to know that it's previously marked as 'pointer to >unknown structure' is suddenly a KNOWN structore? I dont know, I think it >is compiler dependant. So if I NOW do > >ipp = calloc(39,sizeof(struct kevlar_oysters)); /* To keep you happy :-) */ >if (ipp) /* To keep you EVEN HAPPIER B-] */ > ipp->bar = 39; > >The POINT is, will the COMPILER barf here, period. I dont care if the >program kills memory - I won't RUN it, I will just use it as a nice >exercise for my compiler (up - and stretch - and down - and relax) > I always declare structures before I make reference to them. I imagine that it depends on if your compiler allows forward references. Now that this is out of the way, can we please move on? Can't believe we're still haggling over this idotic topic!