Stack Exploration (ITI8510)
Allikas: Lambda
								
												
				| Real-Time Operating Systems and Systems Programming | 
| [ @ ] | 
In preparation for memory management, we shall investigate call stack contents.
Task
Write some small program for further exploration. The program should contain:
-  function main() containing:
- at least 3 integers, with some (different) default values
 - a string
 
 -  function void foo(int argument) containing:
- at least 2 integers, with some default values
 
 
This base program can do practically anything (including nothing), as long as the function foo() runs.
- Modify the program to print the memory addresses of all the variables. Use "%p" for printf() function. Use & operator on the variable to get the memory address as a value.
 - Within function foo(), use the memory address of the first declared variable to print out the value of address which precedes it and the memory address which follows it. (Use * operator to read memory from given location)
 - Can you go further? Can you read the variables of main() just by modifying the address of a variable in foo()? (Yes, but try it out)
 - Can you print the string from main()? Is it located in the stack?
 
// note that there is a difference between the lines: char s[] = "foo:asdasdasd"; // is allocated on the stack char *s = "bar:dsadsadas"; // is not allocated on the stack
- Comment some of the lines which print the addresses of variables in main() (from task 1), check that your program does not use them -- can you still print them by using an address from foo()?
 - Put the variables back to the stack. Write a function which tries to print out all the stack (4 bytes per line using printf() with "%08x\n". The program should crash at some point with a segmentation fault; this is the expected and desired result of the task and should be valued!
 
- Note: For your convenience print the memory location address, then its contents as decimal, hexadecimal, and char.