gcc not compiling

Sjoerd Mullender sjoerd at acm.org
Mon Oct 31 21:23:27 UTC 2005


Derek Martin wrote:
> 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:

Not true.  Or rather, only partially true.
In a variable declaration the two are *not* equivalent.  In a parameter
declaration and in an expression, the two *are* equivalent.
The difference is, in a variable declaration, you also specify how much
space is to be allocated for the variable, which is not the case for the
other uses.
So, the books are indeed correct, **argv and *argv[] are equivalent
*when used in the parameter list*.

> 
> 	#include <stdio.h>
> 	void main (void){
> 	
> 		char foo[] = "This is a string\n";

And this is totally different from
		char *foo = "This is a string\n";
The former declares an array and gives it a name, the latter declares an
anonymous array (string) and creates a pointer to it.  With the former
declaration, you cannot alter the value of foo, with the latter you can
(alter as in foo = some_other_value; or foo++;).

> 		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...]
> 
> 


-- 
Sjoerd Mullender
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 369 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/fedora-list/attachments/20051031/16b07e9b/attachment-0001.sig>


More information about the fedora-list mailing list