Solved

Pointers - passing to functions

Posted on 1998-09-18
4
224 Views
Last Modified: 2010-04-01
I am trying to pass pointers to and from a function.  I have accomplished what I wanted to do, but I think I might have a potential problem.

In My Main Function I created a pointer to type int.  This pointer is going to point to several integer values obtained from function GetChainWheelSizes.

The two variables declared in main are going to be used throughout the entire program in several functions.  

Question : In My function I declare a pointer and allocate memory for it to point at.  When this function is done, I return the pointer.  When I free the memory at the end of the program am I freeing the memory that I allocated in the function since I returned the pointer???

Question : Since I have to use iNumberChainWheels and pChainWheelSizes throughout the program is there a better way to do this??


int main()
 {
 
   int* pChainWheelSizes = NULL ;   // pointer to point to several integers
   int iNumberChainWheels = 0 ;       // gets user input of how many ints stored in pointer

   pChainWheelSizes = GetChainWheelSizes( &iNumberChainWheels );

// Test To See Whats In  pChainWheelSizes

   printf("\nAfter Function Call");
   for ( iLoopVariable = 0 ; iLoopVariable < iNumberChainWheels ; iLoopVariable++ )
   {
      printf("%d ", pChainWheelSizes[iLoopVariable]) ;
    }

 free( pChainWheelSizes );    // is this really freeing the memory allocated in the function?

return 0 ;

}


/*  This function takes iNumberChainWheels whihc is zero.  I only pass it as a pointer so I can use this variable throughout the rest of the program.  I am returning a pointer that holds all the integers entered by the user. */

int * GetChainWheelSizes( int* iNumberChainWheels )
{

 int iLoopVariable = 0 ;
 int *pChainWheelSizes ;
 

   printf("\nNumber Of Chainwheels: ");
   scanf("%d", iNumberChainWheels);
 
   if ( *iNumberChainWheels == 0 )
  return 0;

 if ( ( pChainWheelSizes = (int *) malloc ( sizeof( int ) * (*iNumberChainWheels)) ) == NULL )
 {
  printf(" \n Unable To Allocate Memory For Chain Wheels.");
  return 0;
 }

 printf("\nPlease Provide Chainwheel sizes in ascending order: ");
   
 for ( iLoopVariable = 0 ; iLoopVariable < *iNumberChainWheels ; iLoopVariable++ )
 {
        printf("\nPlease Provide Chainwheel sizes #%d : ", iLoopVariable + 1);
  scanf("%d", &pChainWheelSizes[iLoopVariable]) ;
 }



 // Test To See Whats In  pChainWheelSizes
    for ( iLoopVariable = 0 ; iLoopVariable < *iNumberChainWheels ; iLoopVariable++ )
 {
  printf("%d ", pChainWheelSizes[iLoopVariable]) ;
 }

    return ( pChainWheelSizes ) ;  

}
0
Comment
Question by:larockd
  • 2
4 Comments
 

Accepted Solution

by:
bobbym earned 20 total points
ID: 1173137
Generally speaking you have no problem with this pointer. After all this is the concept of dynamic memory allocation :). As long as you do not change the pointer the free() function will work correctly.
  Well.. regarding the second question you may consider implementing a small class that wraps the pointer and the size so that when the object is destroyed in its destructor it will free the allocated memory. Then declare this object as global and you do not have problems. Like that :

class CWrap
{
public:
CWrap()
{
 m_pInt = NULL;
 m_nSize = 0;
}

CWrap(int nSize)
{
  m_nSize = nSize;
  m_pInt = (int *) malloc ( sizeof( int ) * (*m_nSize)) ;

  if (m_pInt == NULL)
    m_nSize = 0;

}
~CWrap()
{
   if (m_pInt == NULL)
   {
       free(m_pInt);
       m_pInt = NULL
   }
}

int *m_pInt;
int m_nSize;
};

Thus you guarantee that you will not ommit the free call and have leaks (cause the compiler takes care for you).

Hope that helped :))
0
 

Expert Comment

by:bobbym
ID: 1173138
Ooooppps a small bug in the destructor :)) should be !=
0
 
LVL 22

Expert Comment

by:nietod
ID: 1173139
>> Question : Since I have to use iNumberChainWheels
>> and pChainWheelSizes throughout the program is there
>> a better way to do this??
Beginners are often discouraged from using global variables because there is a big temptation to use them inappropriately.  This leads to incomprehensible code, nasty bugs, and program designs that can't be expanded on in many ways.  However, there are times when globals are appropriate.  This might be one.  You should make these global variables and then not pass them as parameters/return values, if the following is true

a)  The program needs only one copy of these values.
b)  The values are needed in many different procedures in the program.  
c)  The values have a significance that is global to the the program.  That is, they tend to affect the way the program works overall, not just one part of it.
0
 

Author Comment

by:larockd
ID: 1173140
Thanks Bobby, and Nietod
0

Featured Post

Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question