Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > come in(I have a puzzled)

Reply
Thread Tools

come in(I have a puzzled)

 
 
Kevin
Guest
Posts: n/a
 
      05-06-2008
Source:
#include <stdio.h>
#include <ctype.h>
void main()
{
char a[]="this is the beautiful world!";
char b[20];
strcpy(b,a);
printf("char array b size is(%d),The content of b is:%s\n",sizeof(b),b);
if(strcmp(a,b)==0)
printf("a equal to b!\n");
}

Now , question as follows:

1. Why "b" size unequal "a" size , but "b" can output "a" content?
2. Why "if(strcmp(a,b)==0)" is true?

 
Reply With Quote
 
 
 
 
Jens Thoms Toerring
Guest
Posts: n/a
 
      05-06-2008
Kevin <(E-Mail Removed)> wrote:
> Source:
> #include <stdio.h>
> #include <ctype.h>


That's not needed but you're missing

#include <string.h>

> void main()


main() always returns an it, so make that

int main( void )

> {
> char a[]="this is the beautiful world!";
> char b[20];
> strcpy(b,a);


Pfff. You just wrote past the end of array 'b'. All bets are off.

> printf("char array b size is(%d),The content of b is:%s\n",sizeof(b),b);
> if(strcmp(a,b)==0)
> printf("a equal to b!\n");


You're missing a

return 0;

> }


> Now , question as follows:


> 1. Why "b" size unequal "a" size , but "b" can output "a" content?


Because you invoked undefined behaviour by writing past the end of b.
Everything can happen from now on, the program may even look as if it
would be working correctly.

> 2. Why "if(strcmp(a,b)==0)" is true?


Because you invoked undefined behavior and the way memory is
set aside for both the arrays by your compiler happened to
make that result possible.
Regards, Jens
--
\ Jens Thoms Toerring ___ http://www.velocityreviews.com/forums/(E-Mail Removed)
\__________________________ http://toerring.de
 
Reply With Quote
 
 
 
 
Bart
Guest
Posts: n/a
 
      05-07-2008
On May 6, 11:45*am, "Kevin" <(E-Mail Removed)> wrote:
> Source:
> #include <stdio.h>
> #include <ctype.h>
> void main()
> {
> * * char a[]="this is the beautiful world!";
> * * char b[20];
> * * strcpy(b,a);
> * * printf("char array b size is(%d),The content of b is:%s\n",sizeof(b),b);
> * * if(strcmp(a,b)==0)
> * * * *printf("a equal to b!\n");
>
> }
>
> Now , question as follows:
>
> 1. Why "b" size unequal "a" size , but "b" can output "a" content?
> 2. Why "if(strcmp(a,b)==0)" is true?


a and b are different types:

a is a pointer to a string
b /is/ a string.

But a can obviously point to a string identical to what's in b.

The size of a will be 4 or whatever, the size of b will be 20
(although it should be more in this case otherwise your "this is..."
string will overflow it).

strcmp() compares two pointers to strings; but b is automatically
converted to such a pointer, thanks to the way C handles arrays.

--
Bartc
 
Reply With Quote
 
ReplyDude
Guest
Posts: n/a
 
      05-07-2008
replied!

Bart Wrote:

> On May 6, 11:45*am, "Kevin" <(E-Mail Removed)> wrote:
> > Source:
> > #include <stdio.h>
> > #include <ctype.h>
> > void main()
> > {
> > * * char a[]="this is the beautiful world!";
> > * * char b[20];
> > * * strcpy(b,a);
> > * * printf("char array b size is(%d),The content of b is:%s\n",sizeof(b),b);
> > * * if(strcmp(a,b)==0)
> > * * * *printf("a equal to b!\n");
> >
> > }
> >
> > Now , question as follows:
> >
> > 1. Why "b" size unequal "a" size , but "b" can output "a" content?
> > 2. Why "if(strcmp(a,b)==0)" is true?

>
> a and b are different types:
>
> a is a pointer to a string
> b /is/ a string.
>
> But a can obviously point to a string identical to what's in b.
>
> The size of a will be 4 or whatever, the size of b will be 20
> (although it should be more in this case otherwise your "this is..."
> string will overflow it).
>
> strcmp() compares two pointers to strings; but b is automatically
> converted to such a pointer, thanks to the way C handles arrays.
>
> --
> Bartc


 
Reply With Quote
 
Keith Thompson
Guest
Posts: n/a
 
      05-07-2008
Bart <(E-Mail Removed)> writes:
> On May 6, 11:45*am, "Kevin" <(E-Mail Removed)> wrote:
>> Source:
>> #include <stdio.h>
>> #include <ctype.h>
>> void main()
>> {
>> * * char a[]="this is the beautiful world!";
>> * * char b[20];
>> * * strcpy(b,a);
>> * * printf("char array b size is(%d),The content of b is:%s\n",sizeof(b),b);
>> * * if(strcmp(a,b)==0)
>> * * * *printf("a equal to b!\n");
>>
>> }
>>
>> Now , question as follows:
>>
>> 1. Why "b" size unequal "a" size , but "b" can output "a" content?
>> 2. Why "if(strcmp(a,b)==0)" is true?

>
> a and b are different types:


Yes.

> a is a pointer to a string


No, a is an array of type char[29] (the length of the literal used to
initialize it plus 1 for the trailing '\0').

> b /is/ a string.


No, b is an array of type char[20]. An array can *contain* a string.

A "string" in C is a a data format, not a data type.

> But a can obviously point to a string identical to what's in b.


The object named ``a'' can't point to anything, since it's an array,
not a pointer. However, the expression ``a'', in most but not all
contexts, has the value of a pointer to (the address of) the first
element of the object named ``a''.

> The size of a will be 4 or whatever, the size of b will be 20
> (although it should be more in this case otherwise your "this is..."
> string will overflow it).


No, sizeof a == 20.

> strcmp() compares two pointers to strings; but b is automatically
> converted to such a pointer, thanks to the way C handles arrays.


I think the other errors in the program have already been pointed out,
but ...

Drop the ``#include <ctype.h>''; it's not needed.
Add ``#include <string.h>''; it *is* needed.
Change ``void main()'' to ``int main(void)''.
Change ``char b[20];'' to, for example, ``char b[30];''.
In the printf call, change ``sizeof(b)'' to ``(int)sizeof b'';
the "%d" format requires an int, not a size_t.
Before the closing brace, add ``return 0;''.
Enable warnings in your compiler, and buy some whitespace (it's really
cheap).

--
Keith Thompson (The_Other_Keith) <(E-Mail Removed)>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
 
Reply With Quote
 
Bart
Guest
Posts: n/a
 
      05-07-2008
On May 7, 10:40*pm, Keith Thompson <(E-Mail Removed)> wrote:
> Bart <(E-Mail Removed)> writes:
> > On May 6, 11:45*am, "Kevin" <(E-Mail Removed)> wrote:
> >> Source:
> >> #include <stdio.h>
> >> #include <ctype.h>
> >> void main()
> >> {
> >> * * char a[]="this is the beautiful world!";
> >> * * char b[20];
> >> * * strcpy(b,a);
> >> * * printf("char array b size is(%d),The content of b is:%s\n",sizeof(b),b);
> >> * * if(strcmp(a,b)==0)
> >> * * * *printf("a equal to b!\n");

>
> >> }

>
> >> Now , question as follows:

>
> >> 1. Why "b" size unequal "a" size , but "b" can output "a" content?
> >> 2. Why "if(strcmp(a,b)==0)" is true?

>
> > a and b are different types:

>
> Yes.
>
> > a is a pointer to a string

>
> No, a is an array of type char[29] (the length of the literal used to
> initialize it plus 1 for the trailing '\0').


Yes, of course, I read it as char *a (I think char a[] is pointer in
some other context).

> > b /is/ a string.

>
> No, b is an array of type char[20]. *An array can *contain* a string.


So some informality.. Here the intention is clearly a string.


>
> A "string" in C is a a data format, not a data type.
>
> > But a can obviously point to a string identical to what's in b.

>
> The object named ``a'' can't point to anything, since it's an array,
> not a pointer. *However, the expression ``a'', in most but not all
> contexts, has the value of a pointer to (the address of) the first
> element of the object named ``a''.
>
> > The size of a will be 4 or whatever, the size of b will be 20
> > (although it should be more in this case otherwise your "this is..."
> > string will overflow it).

>
> No, sizeof a == 20.


Don't know about that, it seems a bit more. But different from sizeof
b anyway, which was the original confusion.

>
> > strcmp() compares two pointers to strings; but b is automatically
> > converted to such a pointer, thanks to the way C handles arrays.


Well if a and b are both arrays, then the reason why strcmp matches
them but sizeof is different is a little different!

(strcmp() only matches characters up to the nul terminator, ignoring
any trailing characters in the array that still contribute to the
sizeof property.)

--
Bartc
 
Reply With Quote
 
Keith Thompson
Guest
Posts: n/a
 
      05-07-2008
Bart <(E-Mail Removed)> writes:
> On May 7, 10:40*pm, Keith Thompson <(E-Mail Removed)> wrote:
>> Bart <(E-Mail Removed)> writes:
>> > On May 6, 11:45*am, "Kevin" <(E-Mail Removed)> wrote:
>> >> Source:
>> >> #include <stdio.h>
>> >> #include <ctype.h>
>> >> void main()
>> >> {
>> >> * * char a[]="this is the beautiful world!";
>> >> * * char b[20];
>> >> * * strcpy(b,a);
>> >> * * printf("char array b size is(%d),The content of b is:%s\n",sizeof(b),b);
>> >> * * if(strcmp(a,b)==0)
>> >> * * * *printf("a equal to b!\n");

>>
>> >> }

>>
>> >> Now , question as follows:

>>
>> >> 1. Why "b" size unequal "a" size , but "b" can output "a" content?
>> >> 2. Why "if(strcmp(a,b)==0)" is true?

>>
>> > a and b are different types:

>>
>> Yes.
>>
>> > a is a pointer to a string

>>
>> No, a is an array of type char[29] (the length of the literal used to
>> initialize it plus 1 for the trailing '\0').

>
> Yes, of course, I read it as char *a (I think char a[] is pointer in
> some other context).


``char a[]'' as a function parameter declaration declares ``a'' as a
pointer (unfortunately, IMHO).

>> > b /is/ a string.

>>
>> No, b is an array of type char[20]. *An array can *contain* a string.

>
> So some informality.. Here the intention is clearly a string.


The intention is that b is an array that contains a string (or rather,
it would contain a string after the strcpy() call *if* b were big
enough). Before the strcpy() call, the contents of b are
indeterminate; it may or may not contain a string.

>> A "string" in C is a a data format, not a data type.
>>
>> > But a can obviously point to a string identical to what's in b.

>>
>> The object named ``a'' can't point to anything, since it's an array,
>> not a pointer. *However, the expression ``a'', in most but not all
>> contexts, has the value of a pointer to (the address of) the first
>> element of the object named ``a''.
>>
>> > The size of a will be 4 or whatever, the size of b will be 20
>> > (although it should be more in this case otherwise your "this is..."
>> > string will overflow it).

>>
>> No, sizeof a == 20.

>
> Don't know about that, it seems a bit more. But different from sizeof
> b anyway, which was the original confusion.


Sorry, my mistake. sizeof a == 29; sizeof b == 20.

>> > strcmp() compares two pointers to strings; but b is automatically
>> > converted to such a pointer, thanks to the way C handles arrays.

>
> Well if a and b are both arrays, then the reason why strcmp matches
> them but sizeof is different is a little different!
>
> (strcmp() only matches characters up to the nul terminator, ignoring
> any trailing characters in the array that still contribute to the
> sizeof property.)


Right. But again, the program as originally posted invokes undefined
behavior. One likely outcome is that, after the call to strcpy(), b
will contain the 20 characters "this is the beautifu" *without* a
trailing '\0'. (There might happen to be a trailing '\0' after the
end of b -- or the strcpy might have clobbered something vital before
anything is printed.)

--
Keith Thompson (The_Other_Keith) <(E-Mail Removed)>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
You have come? Definitely you have not gone shoplifes Python 0 11-25-2007 03:09 PM
You have come? Definitely you have not gone shoplifes Computer Support 0 11-25-2007 03:08 PM
Flash Memory Then and Now: How Far Have We Come? at XYZ Computing Silverstrand Front Page News 0 02-09-2006 02:53 AM
Come One, Come All Jess Guim Digital Photography 0 12-02-2003 04:43 PM
How come most multi parts dont have all parts? 123 Computer Support 2 09-22-2003 01:55 PM



Advertisments