Kevin Meredith
Kevin Meredith

Reputation: 41939

function returns pointer to int

My main() crashes below when add(4) is called.

As I understand int* add, it should return a pointer to integer. Then, I should be able in main to say:

int * a = add(3);

to return a pointer to int.

Please explain what I'm doing wrong.

#include <cstdlib>
#include <iostream>

using namespace std;

int* add (int a) {
   int * c, d;
   d = a + 1;
   *c = d;
   cout << "c = " << c << endl; 
   return c;
}

int main(int argc, char *argv[])
{
    int a = 4;

    int * c;

    c = add(4); 

    system("PAUSE");
    return EXIT_SUCCESS;
}

Upvotes: 4

Views: 6242

Answers (4)

Tyler McHenry
Tyler McHenry

Reputation: 76760

You never allocate any memory to the pointer c. Pointers must refer to valid memory, and you must allocate that memory yourself with a call to new, e.g. write

int* c = new int();

within the add function. Now c points to a valid block of memory that is large enough to hold an int. When you are done with that memory, call delete c to deallocate it and release it back to the system.

Upvotes: 3

JaredPar
JaredPar

Reputation: 755537

The problem is that you have declared an int* but not given it anything to point to. What you need to do is initialize it with a memory location (error checknig omitted)

int* c = new int();
...
*c = d;  // Now works

Later on though you'll need to make sure to free this memory since it's an allocated resource.

A better solution though is to use references. Pointers have several nasty attributes including unitialized values, NULL, need to free, etc ... Most of which aren't present on references. Here is an example of how to use references in this scenario.

void add (int a, int& c) {
   int d;
   d = a + 1;
   c = d;
   cout << "c = " << c << endl; 
}

int c;
add(4, c);

Upvotes: 8

jbernadas
jbernadas

Reputation: 2600

You get an error because c is an uninitialized pointer, so it is undefined behaviour.

Upvotes: 1

sharptooth
sharptooth

Reputation: 170559

In

 *c = d;

the pointer c is not initialized, so your program runs into undefined behavior. You could do something like the following instead:

void add( int what, int* toWhat )
{
    (*toWhat) += what;
}

and call it like this:

int initialValue = ...;
add( 4, &initialValue );

Upvotes: 5

Related Questions