Resources‎ > ‎Programming‎ > ‎C++‎ > ‎C++ Tutorial‎ > ‎Lesson 5‎ > ‎

Sample Solutions

Practice 2 - 5

/*

 * main.cpp

 *

 *  Created on: Apr 2, 2011

 *      Author: masa

 */


#include <iostream>

#include <string>


using namespace std;


extern "C" {

    void dumpStack32(void*, int);

}


void foo(int, int);

void boo();

unsigned long *org_ptr;

int offset = 4;


int main(){

    foo(1, 2);

    

    return 0;

}


void dumpStack32(void* ptr, int counts) {

    unsigned long *ulong_ptr = (unsigned long *)ptr;

    

    printf("---------------------\n");

    printf(" address | long var  \n");

    printf("---------------------\n");

    for(int i=0; i<counts; i++)

        printf(" %08x| %08x \n", &ulong_ptr[i], (unsigned int)ulong_ptr[i]);

    printf("-----------------------------------------\n");

}


void foo(int a, int b) {

    int c = a + b;

    cout << "Sum is :" << c << endl;

    dumpStack32(&c, 15);

    unsigned long *ulong_ptr = (unsigned long *)&a;

    printf(" %08x\n", *(ulong_ptr+offset));

    org_ptr = (unsigned long *)*(ulong_ptr+offset);

    printf("main's address  %08x", (unsigned long)(&main));

    *(ulong_ptr+offset) = (long unsigned int)&boo;

}


void boo(){

    int c = 5;

    cout << endl << "Boo!" << endl;

    

    unsigned long *ulong_ptr = (unsigned long *)&c;

    printf(" %08x", *(ulong_ptr+2));

    printf(" org = %08x", org_ptr);

    *(ulong_ptr+2) = (long unsigned int)org_ptr;

    dumpStack32(&c, 10);

}

For prac5, to obtain vtable:

unsigned long *fooptr = *(unsigned long**) &foo;
unsigned long *barptr = *(unsigned long**) &boo;
Comments