Reputation: 41939
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
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
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
Reputation: 2600
You get an error because c is an uninitialized pointer, so it is undefined behaviour.
Upvotes: 1
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