Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Can someone please explain the output of this code?

Reply
Thread Tools

Can someone please explain the output of this code?

 
 
Aarti
Guest
Posts: n/a
 
      07-27-2007
Hi,

Can some one please explain why the output of this program is 15

#include <iostream>

using namespace std;

class A
{
public:
A():i(1)
{}
int i;
};

class B: public A
{
public:
B():j(2)
{}
int j;
};

int f(A* p, int count)
{
int total = 0;
for(int i=0; i<count; ++i)
{
total+=p++->i;
}
return(total);

}

int main()
{
B b[11];
cout << f(b,10);
return 0;
}

Regards,

 
Reply With Quote
 
 
 
 
Thomas J. Gritzan
Guest
Posts: n/a
 
      07-27-2007
Aarti wrote:
> Hi,
>
> Can some one please explain why the output of this program is 15

[...]
> class A

[...]
> class B: public A

[...]
> int f(A* p, int count)
> {
> int total = 0;
> for(int i=0; i<count; ++i)
> {
> total+=p++->i;
> }
> return(total);
>
> }
>
> int main()
> {
> B b[11];
> cout << f(b,10);
> return 0;
> }


You invoked undefined behaviour by treating an array of Bs as array of As.

See Item 3 "Never treat arrays polymorphically" in Scott Meyers's "More
Effective C++"

--
Thomas
http://www.netmeister.org/news/learn2quote.html
 
Reply With Quote
 
 
 
 
Daniel T.
Guest
Posts: n/a
 
      07-27-2007
Aarti <(E-Mail Removed)> wrote:

> Can some one please explain why the output of this program is 15
>
> #include <iostream>
>
> using namespace std;
>
> class A
> {
> public:
> A():i(1)
> {}
> int i;
> };
>
> class B: public A
> {
> public:
> B():j(2)
> {}
> int j;
> };


Note, sizeof(B) > sizeof(A). For the sake of this explanation, let's
assume that sizeof(B) is 8 and sizeof(A) is 4.

> int f(A* p, int count)
> {
> int total = 0;
> for(int i=0; i<count; ++i)
> {
> total+=p++->i;


The increment above moves 'p' by sizeof(A) bytes. i.e., 4 bytes, but
since the object pointed to by 'p' is really a B, 'p' now points to the
middle of a B object.

> }
> return(total);
>
> }
>
> int main()
> {
> B b[11];


In the above line, you create an array of B. If sizeof(B) is 8, and b[0]
is at address location 0x0, then b[1] is at address location 0x8.

> cout << f(b,10);
> return 0;
> }
>
> Regards,

 
Reply With Quote
 
joe
Guest
Posts: n/a
 
      07-27-2007
You have exercised a big no-no. When you increment a pointer, what
you are effectively doing is adding the sizeof the pointee type to the
value of the pointer. This allows you to visit the next element of an
array automatically. What you have done here is passed an array of B-
s (which are larger than A-s) into your function and trying to access
it as though it were A-s. So, what happens is that you take your
pointer and add sizeof A to it. This means that your pointer now
points into the middle of your B object somewhere. It just so happens
that since this class is simple and nothing faults, but you are now
treating the middle of the B as another A. This is bad. It turns out
that in your example you effectivly access b[0].i + b[0].j + b[1].i +
b[1].j .... and so forth. This gives 5 * 1 + 5 * 2 = 15. Normally, I
might expect a fault if things were more complicated than simple ints
and it is definitely undefined behavior.

joe

 
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
70-292: can someone please verify / explain the answer to this question Tim Moor MCSE 7 12-18-2005 03:30 AM
Can Someone Please Explain... BluDog ASP .Net 4 10-05-2004 08:24 AM
Can someone please explain 'em' to me? delerious@no.spam.com HTML 4 12-04-2003 02:28 PM
can someone explain this to me please Mike Henley Java 6 09-07-2003 03:19 AM
Re: please can someone explain the following code. suzy ASP .Net 3 07-31-2003 02:07 PM



Advertisments