gcc not compiling

STYMA, ROBERT E (ROBERT) stymar at lucent.com
Mon Oct 31 21:32:01 UTC 2005


> On Mon, Oct 31, 2005 at 01:30:44PM -0600, STYMA, ROBERT E (ROBERT) wrote:
> > The syntax:
> > int main(int argc, char **argv)
> > works, but most of the C books I have seen recommend
> > the *argv[] version.
> 
> I meant to comment that these two different notations are functionally
> identical; an array name is nothing more than a pointer.  For example,
> if we have the following code:
> 
> 	#include <stdio.h>
> 	void main (void){
> 	
> 		char foo[] = "This is a string\n";
> 		char *bar = foo;
> 	
> 		/* these expressions all print "T\n" */
> 		printf("%c\n", foo[0]);
> 		printf("%c\n", *bar);
> 		printf("%c\n", bar[0]);
> 		printf("%c\n", *foo);
> 	
> 		/* these expressions all print "i\n" */
> 		printf("%c\n", foo[2]);
> 		printf("%c\n", *(bar + 2));
> 		printf("%c\n", bar[2]);
> 		printf("%c\n", *(foo + 2));
> 	}
> 
> The results may surprise programming students:
> 
> 	$ gcc -o ptr ptr.c
> 	ptr.c: In function `main':
> 	ptr.c:2: warning: return type of 'main' is not `int'
> 	[ddm at archonis ~]
> 	$ ./ptr
> 	T
> 	T
> 	T
> 	T
> 	i
> 	i
> 	i
> 	i
> 	
> 
> In reality, foo[x] is just "syntactic sugar" for *(foo + x).  This
> is called pointer math, and works properly regardless of the size and
> type of foo, so long as it was declared properly before being used.
> 
> [I'm very bored today...]

BTW, this is only for the benefit of the original poster.  Maybe he
will remember this tidbit when the prof gets to parameters and arrays.

I agree,  char   **a, and char *a[] are equivalent.  It only a style
issue.  Students sometimes take this too literally can can get in
trouble.  The equivalency is really only in parameter passing because
arrays are passed as the address of the array.  That effectively 
results in pass by reference instead of pass by value for the array.
>From a lecture I used to give (titled:  C  Gun, Bullet, and Foot):

file1.c

char     external_str[20] = "hello world";



file2.c

extern char   *external_str;


"If you were to link these two files together and then access
via the reference in file2.c, the generated code would take
the first 4 bytes of the string, assume they were and address,
and attempt to go there and get the data.  And that would be
exactly where your program would go."  That last line would always
get a chuckle after about 5 seconds.

Bob Styma




More information about the fedora-list mailing list