home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #26 / NN_1992_26.iso / spool / comp / lang / c / 16390 < prev    next >
Encoding:
Internet Message Format  |  1992-11-12  |  3.3 KB

  1. Path: sparky!uunet!zaphod.mps.ohio-state.edu!magnus.acs.ohio-state.edu!usenet.ins.cwru.edu!agate!dog.ee.lbl.gov!horse.ee.lbl.gov!torek
  2. From: torek@horse.ee.lbl.gov (Chris Torek)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: How does the Address-of Operator (&) really work?
  5. Date: 12 Nov 1992 13:31:42 GMT
  6. Organization: Lawrence Berkeley Laboratory, Berkeley
  7. Lines: 69
  8. Distribution: world
  9. Message-ID: <27403@dog.ee.lbl.gov>
  10. References: <1ds9htINNd81@agate.berkeley.edu>
  11. Reply-To: torek@horse.ee.lbl.gov (Chris Torek)
  12. NNTP-Posting-Host: 128.3.112.15
  13.  
  14. In article <1ds9htINNd81@agate.berkeley.edu> achoi@soda.berkeley.edu
  15. (Andrew Choi) writes:
  16. >  I was told that the address-of operator & (along with sizeof)
  17. >is done at compilation [time]
  18.  
  19. This is not strictly correct.  Many systems will compute addresses
  20. during compilation, rather than at runtime, but there is no such
  21. guarantee in the language.  Furthermore, addresses of automatic
  22. objects do not even exist at compile time:
  23.  
  24.     void pointless(void) {
  25.         int i, *j = &i;
  26.         ...
  27.     }
  28.  
  29. The value `&i' is not a compile-time constant.
  30.  
  31. >therefore, it becomes legal to do the followings:
  32. >
  33. >  &(((struct S *) NULL)->field)
  34.  
  35. This also is false.  It usually works, and is how many (if not most)
  36. implementations actually implement the ANSI `offsetof' macro, but it is
  37. not guaranteed to work, or to return anything useful.  (This is *why*
  38. ANSI *has* an offsetof macro.)
  39.  
  40. >However, what I don't understand is how it works under multiple
  41. >files.  Considered the followings:
  42. >
  43. >  /* file "foo.c" */
  44. >  char *a = "This is a test";
  45. >
  46. >  /* file "bar.c" */
  47. >  char **b = &a;
  48. >
  49. >When the 2 files, "bar.c" and "foo.c" are separately compiled,
  50. >what does the compiler put for "&a", since it does not know where
  51. >the definition for "a" is?
  52.  
  53. The compiler must emit some sort of directive to the rest of the
  54. compilation system---which may be called the `linker' on your machine
  55. ---telling it that it has to initialize `b' before calling main().
  56. This initialization is typically performed at link time, although
  57. again there is no such guarantee in the C language.
  58.  
  59. Remember that the ANSI standard says only that there is a *system* that
  60. acts as specified by the standard.  It does not say how the system is
  61. built, or how it is to do what it must.  It says only *what happens*.
  62.  
  63. The actual mechanics on traditional systems, at least for this case,
  64. are that the `object files' are in a special format (e.g., a bit
  65. stream, a sequence of records, a set of sections, or whatever) that
  66. includes a `symbol table' and `relocation information'.  The relocation
  67. information says things like:
  68.  
  69.     In file bar.o, at offset +104 in the read/write data section,
  70.     insert the value of the global symbol `_a'.
  71.  
  72. The actual encoding varies wildly from one system to another.  Any
  73. system that implements the ANSI C standard must provide *some*
  74. mechanism by which a static pointer variable can be set to point to a
  75. named static object plus an integer constant offset, or to a named
  76. function (without an offset), but the standard (and this newsgroup)
  77. will not say how *your* system does this.  Your system's particular
  78. needs are unique to your system, and you should find them described
  79. in documents (and newsgroups) also specific to your system.
  80. -- 
  81. In-Real-Life: Chris Torek, Lawrence Berkeley Lab CSE/EE (+1 510 486 5427)
  82. Berkeley, CA        Domain:    torek@ee.lbl.gov
  83.