Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!swrinde!zaphod.mps.ohio-state.edu!samsung!olivea!orc!inews!cmdnfs!bhoughto From: bhoughto@cmdnfs.intel.com (Blair P. Houghton) Newsgroups: comp.std.c Subject: Re: ref. to array != ptr Message-ID: <906@inews.intel.com> Date: 9 Nov 90 18:23:33 GMT References: <894@inews.intel.com> <14391@smoke.brl.mil> Sender: news@inews.intel.com Organization: Intel Corp, Chandler, AZ Lines: 126 In article <14391@smoke.brl.mil> gwyn@smoke.brl.mil (Doug Gwyn) writes: >In article <894@inews.intel.com> bhoughto@cmdnfs.intel.com (Blair P. Houghton) writes: >> is there anything more explicit stating that the declaration of an >>externally-defined pointer to Type can not specify an array of Type >>with the same identifier defined externally? > >Sure. 3.1.2.6: "All declarations that refer to the same object or >function shall have compatible type; otherwise, the behavior is undefined." Well, yes, I should have mentioned this as part of the inference; I'm wondering if there isn't anything to the effect of "don't do this" explicitly mentioning array/pointer confusions in multiple translation units. The more 3.1.2.6 and the definitions of compatible pointers and compatible arrays sink in, though, the clearer the inference becomes. I was just hoping that, as was done for a number of other things, there'd be an example of /*RIGHT*/ and /*WRONG*/ coding. --Blair "cf. any of Henry's and my stuff, respectively..." A long example of the behavior is included below (silly me, but I did this with Ultrix' cc, which isn't even a conforming compiler). I suggest you hit 'n' unless you've never seen this situation before (although the difference between the results of defining an array and declaring a pointer and vice-versa are interesting, even if they are undefined in conforming implementations). 3 Files (ex1.c, ex2.c, Makefile): :::::::::::::: /eng/eng21/bhoughto/bin/experiment/ex1.c :::::::::::::: /* ex1.c -- yahwp; used with ex2.c to show how not to declare external arrays */ /* choose a definition: */ /* proper corresponding declaration: */ #if DEF_AS_PTR char *hello = "Hello, world!\n"; /* use DECL_AS_PTR in ex2.c */ #else char hello[] = "Hello, world!\n"; /* use with not DECL_AS_PTR in ex2.c */ #endif main() { printf("%s\n",hello); foo(); } :::::::::::::: /eng/eng21/bhoughto/bin/experiment/ex2.c :::::::::::::: /* ex2.c -- the right and wrong way to declare an externally defined array */ /* choose a declaration: */ /* proper corresponding definition: */ #if DECL_AS_PTR char *hello; /* use iff DEF_AS_PTR in ex1.c */ #else char hello[]; /* use iff not DEF_AS_PTR in ex1.c */ #endif foo() { printf("%s\n",hello); } :::::::::::::: /eng/eng21/bhoughto/bin/experiment/Makefile :::::::::::::: # testing external array/pointer declaration/confusion # executable names encode value of (DEF_AS_PTR, DECL_AS_PTR) external: ex0 ex1 ex2 ex3 ex0: cc -DDEF_AS_PTR=0 -DDECL_AS_PTR=0 -c ex1.c cc -DDEF_AS_PTR=0 -DDECL_AS_PTR=0 -c ex2.c cc -DDEF_AS_PTR=0 -DDECL_AS_PTR=0 -o ex0 ex1.o ex2.o ex1: cc -DDEF_AS_PTR=0 -DDECL_AS_PTR=1 -c ex1.c cc -DDEF_AS_PTR=0 -DDECL_AS_PTR=1 -c ex2.c cc -DDEF_AS_PTR=0 -DDECL_AS_PTR=1 -o ex1 ex1.o ex2.o ex2: cc -DDEF_AS_PTR=1 -DDECL_AS_PTR=0 -c ex1.c cc -DDEF_AS_PTR=1 -DDECL_AS_PTR=0 -c ex2.c cc -DDEF_AS_PTR=1 -DDECL_AS_PTR=0 -o ex2 ex1.o ex2.o ex3: cc -DDEF_AS_PTR=1 -DDECL_AS_PTR=1 -c ex1.c cc -DDEF_AS_PTR=1 -DDECL_AS_PTR=1 -c ex2.c cc -DDEF_AS_PTR=1 -DDECL_AS_PTR=1 -o ex3 ex1.o ex2.o Results (name of executable encodes setting of (DEF_AS_PTR,DECL_AS_PTR): Script started on Fri Nov 9 11:09:33 1990 prompt> ex0 Hello, world! Hello, world! prompt> ex1 Hello, world! Segmentation fault (core dumped) prompt> ex2 Hello, world! 8^P prompt> ex3 Hello, world! Hello, world! prompt> ^D script done on Fri Nov 9 11:10:03 1990