// -------------------
// FunctionReturns.c++
// -------------------

#include <cassert>  // assert
#include <iostream> // cout, endl

int f () {
    int i = 2;
    return i;}

int* g () {
    int j = 2;
    return &j;}            // warning: address of local variable 'j' returned

int& h () {
    int k = 2;
    return k;}             // warning: reference to local variable 'k' returned

char* c1 () {
    char a[] = "abc";      // 'a' is a local array
//  a = "def";             // doesn't compile
    return a;}             // warning: address of local variable 'a' returned

const char* c2 () {
    const char* a = "abc"; // 'a' is a local pointer
    a = "def";
    return a;}             // well-defined

int main () {
    using namespace std;
    cout << "FunctionReturns.c++" << endl;

    {
    int v = f();
    assert(v == 2);
    }

    {
    int* p = g();
    assert(*p == 2); // valgrind: Address 0xbef9ea24 is just below the stack ptr.
    }

    {
    int& r = h();
    assert(r == 2);  // valgrind: Address 0xbef9ea24 is just below the stack ptr.
    }

    cout << "Done." << endl;
    return 0;}


syntax highlighted by Code2HTML, v. 0.9.1