Returning an array inside a structure that was allocated in afunction

C

ctj951

I have a very specific question about a language issue that I was
hoping to get an answer to. If you allocate a structure that contains
an array as a local variable inside a function and return that
structure, is this valid?

As shown in the code below I am allocating the structure in the
function and then returning the structure. I know if the structure
contained only simple types (int, float) this will work without
problems as you are getting a copy of those items returned from the
function. But I'm wondering with an array which is being returned
from the function as part of the structure is a pointer to the local
variable or perhaps a copy of that array (as it would be for simple
types). I think we might be getting a pointer returned but I'm not
sure.

#include <iostream>
using namespace std;

struct Item
{
int itemNumber;
int internalItems[5];
};


Item CreateItem()
{
Item newItem;

newItem.itemNumber = 10;

newItem.internalItems[ 0 ] = 1;
newItem.internalItems[ 1 ] = 2;
newItem.internalItems[ 2 ] = 3;
newItem.internalItems[ 3 ] = 7;
newItem.internalItems[ 4 ] = 9;

return( newItem );
}


void PrintItem( Item iItemToPrint )
{
cout << iItemToPrint.internalItems[0];
}


int main ()
{
Item testItem = CreateItem();

PrintItem( testItem );

return 0;
}

This is a specific question about a specific language issue. Thank
You.
 
L

Leandro Melo

I have a very specific question about a language issue that I was
hoping to get an answer to.  If you allocate a structure that contains
an array as a local variable inside a function and return that
structure, is this valid?

As shown in the code below I am allocating the structure in the
function and then returning the structure.  I know if the structure
contained only simple types (int, float) this will work without
problems as you are getting a copy of those items returned from the
function.  But I'm wondering with an array which is being returned
from the function as part of the structure is a pointer to the local
variable or perhaps a copy of that array (as it would be for simple
types).  I think we might be getting a pointer returned but I'm not
sure.

#include <iostream>
using namespace std;

struct Item
   {
   int itemNumber;
   int internalItems[5];
   };

Item CreateItem()
   {
   Item newItem;

   newItem.itemNumber = 10;

   newItem.internalItems[ 0 ] = 1;
   newItem.internalItems[ 1 ] = 2;
   newItem.internalItems[ 2 ] = 3;
   newItem.internalItems[ 3 ] = 7;
   newItem.internalItems[ 4 ] = 9;

   return( newItem );
   }

void PrintItem( Item iItemToPrint )
   {
   cout << iItemToPrint.internalItems[0];
   }

int main ()
   {
   Item testItem = CreateItem();

   PrintItem( testItem );

   return 0;
   }

This is a specific question about a specific language issue.  Thank
You.



This is one of the reasons copy constructors exist. ;) Think about
which semantics you would like for a particular class (deep copy,
shallow copy) and write a copy constructor accordingly.
 
B

Bo Persson

ctj951 said:
I have a very specific question about a language issue that I was
hoping to get an answer to. If you allocate a structure that
contains an array as a local variable inside a function and return
that structure, is this valid?

As shown in the code below I am allocating the structure in the
function and then returning the structure. I know if the structure
contained only simple types (int, float) this will work without
problems as you are getting a copy of those items returned from the
function. But I'm wondering with an array which is being returned
from the function as part of the structure is a pointer to the local
variable or perhaps a copy of that array (as it would be for simple
types). I think we might be getting a pointer returned but I'm not
sure.

#include <iostream>
using namespace std;

struct Item
{
int itemNumber;
int internalItems[5];
};


Item CreateItem()
{
Item newItem;

newItem.itemNumber = 10;

newItem.internalItems[ 0 ] = 1;
newItem.internalItems[ 1 ] = 2;
newItem.internalItems[ 2 ] = 3;
newItem.internalItems[ 3 ] = 7;
newItem.internalItems[ 4 ] = 9;

return( newItem );
}


void PrintItem( Item iItemToPrint )
{
cout << iItemToPrint.internalItems[0];
}


int main ()
{
Item testItem = CreateItem();

PrintItem( testItem );

return 0;
}

This is a specific question about a specific language issue. Thank
You.

This is quite ok. You are returning a struct, and all its members will
be copied. There are no pointers involved.


Bo Persson
 
M

mail.dsp

No need to think about it. Since in structure you've allocated memory
at compile time therefore default copy constructor will be invoked and
it will copy all the member of structure properly. Even it will work
in case of assignment too. But in case of run time allocation you'll
have to define your copy constructor(deep copy) and overload
assignment operator for proper functionality.
 
L

Leandro Melo

I have a very specific question about a language issue that I was
hoping to get an answer to.  If you allocate a structure that contains
an array as a local variable inside a function and return that
structure, is this valid?
As shown in the code below I am allocating the structure in the
function and then returning the structure.  I know if the structure
contained only simple types (int, float) this will work without
problems as you are getting a copy of those items returned from the
function.  But I'm wondering with an array which is being returned
from the function as part of the structure is a pointer to the local
variable or perhaps a copy of that array (as it would be for simple
types).  I think we might be getting a pointer returned but I'm not
sure.
#include <iostream>
using namespace std;
struct Item
   {
   int itemNumber;
   int internalItems[5];
   };
Item CreateItem()
   {
   Item newItem;
   newItem.itemNumber = 10;
   newItem.internalItems[ 0 ] = 1;
   newItem.internalItems[ 1 ] = 2;
   newItem.internalItems[ 2 ] = 3;
   newItem.internalItems[ 3 ] = 7;
   newItem.internalItems[ 4 ] = 9;
   return( newItem );
   }
void PrintItem( Item iItemToPrint )
   {
   cout << iItemToPrint.internalItems[0];
   }
int main ()
   {
   Item testItem = CreateItem();
   PrintItem( testItem );
   return 0;
   }
This is a specific question about a specific language issue.  Thank
You.

This is one of the reasons copy constructors exist. ;) Think about
which semantics you would like for a particular class (deep copy,
shallow copy) and write a copy constructor accordingly.

Hmm... your array is statically allocated. No worry then.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top