Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Return type for this function

my function prototype is this.

int * f4(int parm);

my function looks like this

int * f4(int parm)
{
    return &parm + 1;  
}

Is my return type correct for this? because it isn't doing anything when I call the function.

this is my call

int *pointer1;
pointer1 = f4(319);
cout << pointer1 << endl;

it returns the address of the pointer, but I need it to return the value, but I can't seem to get it to work.

using

cout << *pointer << endl;

just displays 0

like image 970
user2234688 Avatar asked Sep 09 '26 12:09

user2234688


2 Answers

The problem is the object parm is local to that function. It's not legal to take and keep (i.e. return) a pointer to it after the function invocation ends.

In other words, parm "lives" while the function exists. When the function returns all its local objects (such as parm) "die".

As crush notes in the comments, pointer1 becomes an invalid pointer, also affectionately called a "dangling" pointer.

so show the correct way to do it!!

As requested, there are a few ways to "correctly" do this:

  • Return parm + 1 directly, and change the return type of the function. It doesn't sound like you really need a pointer

  • Take the parameter as a pointer (or reference, this is C++) and increment its pointed value. You can also return it if you so desire - returning it is valid since it comes from outside the function

  • Add a static static int sparm; sparm = parm + 1 and return a pointer to sparm. This will make your function non-reentrant but it will work: static objects don't die when the function invocation ends

  • Allocate (ugh! don't!) some memory for a pointer and return that


Upon reading the code more carefully, it is quite clear that pointer is never valid. From the start it's one slot beyond the memory available as parm.

like image 147
cnicutar Avatar answered Sep 11 '26 02:09

cnicutar


Returning a pointer to a local variable is bad news. parm is a function parameter, and so is local to f4. You're returning a bad pointer to the caller and then trying to dereference it. That will only end in tears.

like image 39
Carl Norum Avatar answered Sep 11 '26 03:09

Carl Norum