Solved

Pointers - passing to functions

Posted on 1998-09-18
4
222 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

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

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…
IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
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 clear a vector as well as how to detect empty vectors in C++.

747 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

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now