Path: utzoo!utgpu!news-server.csri.toronto.edu!rutgers!cs.utexas.edu!uunet!unhd!rg From: rg@uunet!unhd (Roger Gonzalez ) Newsgroups: comp.lang.c Subject: extern char *foo vs. extern char foo[] Message-ID: <1990May30.001219.23564@uunet!unhd> Date: 30 May 90 00:12:19 GMT Reply-To: rg@unhd.unh.edu.UUCP (Roger Gonzalez ) Distribution: comp Organization: Marine Systems Engineering Lab Lines: 61 A little history: I know C inside and out, and don't need any "I think"s. I have been aware of this "feature" for quite a while, and know how to program around it. I am posting this to find out *why* things are done this way, since it seems to violate what K&R say. According to K&R, there should be no difference between the two extern defs in my subject header. In fact, the second form (char foo[]) should get translated into the first. Unfortunately, it doesn't. Here's a more detailed example of what I mean: FILE #1: char hello[100]; main() { strcpy(hello, "Hello, world.\n"); printf("In main(), hello is at %06X\n", hello); foo(); } FILE #2: extern char *hello; foo() { printf("In foo(), hello is at %06X\n", hello); } Now, theoretically, since C is not strongly typed, the two values printed should be the same. They aren't. Try it if you don't believe me. If you change file #2 so that the extern declaration is extern hello[]; it works. It also will work properly if in file #1, hello is declared to be a pointer to char, and is malloc-ated to 100 bytes. Well, I poked around a little further; I stopped the output at the assembler stage, and looked at the .s files for file #2 (using the first method of correction, namely declaring extern char hello[]), did a diff, and guess what I found? > mov hello, (sp%) I know, I know. This isn't *quite* what I < found, but I'm typing it from memory, and its mov &hello, (sp%) close enough for government work. Aha! Zees eez very wrong! This is the same output I got on 3 different machines, running Unisoft and Green Hills compilers. So. Why are my compilers so stupid? Do others behave the same way, or am I just unfortunate enough to have lousy software? If this is more widespread, WHY? Is this a manifestation of some other C rule that takes precedence over what the "proper" behavior? Please clue me in. Please. -Roger -- UUCP: ..!uunet!unhd!rg | USPS: Marine Systems Engineering Laboratory BITNET: r_gonzalez at unhh | University of New Hampshire PHONE: (603) 862-4600 | Marine Programs Building FAX: (603) 862-4399 | Durham, NH 03824-3525