<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.kram.nz/index.php?action=history&amp;feed=atom&amp;title=SE250%3Alab-2%3Ahpan027</id>
	<title>SE250:lab-2:hpan027 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.kram.nz/index.php?action=history&amp;feed=atom&amp;title=SE250%3Alab-2%3Ahpan027"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-2:hpan027&amp;action=history"/>
	<updated>2026-04-28T09:24:27Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.kram.nz/index.php?title=SE250:lab-2:hpan027&amp;diff=4897&amp;oldid=prev</id>
		<title>Mark: 23 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-2:hpan027&amp;diff=4897&amp;oldid=prev"/>
		<updated>2008-11-03T05:18:58Z</updated>

		<summary type="html">&lt;p&gt;23 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Lab Report&lt;br /&gt;
&lt;br /&gt;
*Is it just me or does this lab take forever?&lt;br /&gt;
&lt;br /&gt;
1. &lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int main(void) {&lt;br /&gt;
     int* int_pointer;&lt;br /&gt;
     double* double_pointer;&lt;br /&gt;
     float* float_pointer;&lt;br /&gt;
     long* long_pointer;&lt;br /&gt;
     short* short_pointer;&lt;br /&gt;
 &lt;br /&gt;
     int int_variable;&lt;br /&gt;
     double double_variable;&lt;br /&gt;
     float float_variable;&lt;br /&gt;
     long long_variable;&lt;br /&gt;
     short short_variable;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     printf( &amp;quot;%d %d %d %d %d\n&amp;quot;, sizeof(int_pointer), sizeof(double_pointer),&lt;br /&gt;
 	    sizeof(float_pointer), sizeof(long_pointer), sizeof(short_pointer) );&lt;br /&gt;
 &lt;br /&gt;
     printf( &amp;quot;%d %d %d %d %d&amp;quot;, sizeof(int_variable), sizeof(double_variable),&lt;br /&gt;
 	     sizeof(float_variable), sizeof(long_variable), &lt;br /&gt;
 	     sizeof(short_variable) );&lt;br /&gt;
  &lt;br /&gt;
     return 1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Returns (for both Windows and Linux)&lt;br /&gt;
&lt;br /&gt;
 4 4 4 4 4&lt;br /&gt;
 &lt;br /&gt;
 4 8 4 4 2&lt;br /&gt;
&lt;br /&gt;
From this we can see:&lt;br /&gt;
*All pointers are the same size, regardless of the variable type they point to&lt;br /&gt;
*Pointers and variables of type int, float and long share the same size&lt;br /&gt;
*Double variables are twice the size of pointers&lt;br /&gt;
*Short variables are half the size&lt;br /&gt;
&lt;br /&gt;
2.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int main(void)&lt;br /&gt;
 {&lt;br /&gt;
     int x;&lt;br /&gt;
     int y;&lt;br /&gt;
 &lt;br /&gt;
     printf( &amp;quot;&amp;amp;x = %p, &amp;amp;y = %p, diff = %ld\n&amp;quot;, &amp;amp;x, &amp;amp;y, (long)(&amp;amp;x - &amp;amp;y) );&lt;br /&gt;
     printf( &amp;quot;&amp;amp;x = %p, &amp;amp;y = %p, diff = %ld\n&amp;quot;, &amp;amp;x, &amp;amp;y, ((long)&amp;amp;x - (long)&amp;amp;y) );&lt;br /&gt;
 &lt;br /&gt;
     return 1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Output (Windows):&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;x = 0x22cca4, &amp;amp;y = 0x22cca0, diff = 1&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;x = 0x22cca4, &amp;amp;y = 0x22cca0, diff = 4&lt;br /&gt;
&lt;br /&gt;
Output (Linux):&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;x = 0xffa159dc, &amp;amp;y = 0xffa159d8, diff = 1&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;x = 0xffa159dc, &amp;amp;y = 0xffa159d8, diff = 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*It seems that putting (long) in front of both variables make C treat this purely as a numerical calculation, where the difference between two numbers is calculated&lt;br /&gt;
*Putting (long) in front of the whole expression make C take into consideration the type of the variable, hence they are calculated to be one &amp;quot;int&amp;quot; apart&lt;br /&gt;
*Linux seems to have a completely different set of memory addresses, but the difference remains the same&lt;br /&gt;
&lt;br /&gt;
3.&lt;br /&gt;
&lt;br /&gt;
Output with arr[4] (Windows):&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;x = 0x22cca4, &amp;amp;y = 0x22cc9c, diff(bytes) = 8&lt;br /&gt;
 &lt;br /&gt;
 size of array = 4&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;arr = 0x22cca0, arr+4 = 0x22cca4, &amp;amp;arr[4] = 0x22cca4&lt;br /&gt;
&lt;br /&gt;
Output with arr[4] (Linux):&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;x = 0xffe709dc, &amp;amp;y = 0xffe709d4, diff(bytes) = 8&lt;br /&gt;
 &lt;br /&gt;
 size of array = 4&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;arr = 0xffe709d8, arr+4 = 0xffe709dc, &amp;amp;arr[4] = 0xffe709dc&lt;br /&gt;
&lt;br /&gt;
*The size of the array is 4 bytes&lt;br /&gt;
*&amp;amp;arr is the address of the first element in the array&lt;br /&gt;
*arr+4 and &amp;amp;arr[4] refers to the same thing: the address 4 bytes from the first element in arr - which in this case is where the variable x is stored&lt;br /&gt;
*Difference between &amp;amp;x and &amp;amp;y is 8 bytes&lt;br /&gt;
*Again, the only difference with running Linux is the part of memory the variables are stored in&lt;br /&gt;
&lt;br /&gt;
Output for arr[0] - arr[10] (Windows):&lt;br /&gt;
&lt;br /&gt;
 arr[0], diff (bytes) = 32&lt;br /&gt;
 arr[1], diff (bytes) = 8&lt;br /&gt;
 arr[2], diff (bytes) = 8&lt;br /&gt;
 arr[3], diff (bytes) = 32&lt;br /&gt;
 arr[4], diff (bytes) = 8&lt;br /&gt;
 arr[5], diff (bytes) = 32&lt;br /&gt;
 arr[6], diff (bytes) = 32&lt;br /&gt;
 arr[7], diff (bytes) = 32&lt;br /&gt;
 arr[8], diff (bytes) = 16&lt;br /&gt;
 arr[9], diff (bytes) = 32&lt;br /&gt;
 arr[10], diff (bytes) = 32&lt;br /&gt;
&lt;br /&gt;
Output for arr[0] - arr[10] (Linux):&lt;br /&gt;
&lt;br /&gt;
 arr[0], diff (bytes) = 4&lt;br /&gt;
 arr[1], diff (bytes) = 4&lt;br /&gt;
 arr[2], diff (bytes) = 4&lt;br /&gt;
 arr[3], diff (bytes) = 4&lt;br /&gt;
 arr[4], diff (bytes) = 8&lt;br /&gt;
 arr[5], diff (bytes) = 4&lt;br /&gt;
 arr[6], diff (bytes) = 4&lt;br /&gt;
 arr[7], diff (bytes) = 4&lt;br /&gt;
 arr[8], diff (bytes) = 4&lt;br /&gt;
 arr[9], diff (bytes) = 4&lt;br /&gt;
 arr[10], diff (bytes) = 4&lt;br /&gt;
&lt;br /&gt;
*The Linux results were initially very confusing&lt;br /&gt;
*Upon closer inspection of the memory addresses, it seems that arr is not always stored between x and y. In fact, the only time it is stored between x and y is when the size of the array if 4. For all other instances, x and y is stored consecutively and arr is moved to either before or after the pair&lt;br /&gt;
*Windows seems to dump arr between x and y regardless of the size of the array&lt;br /&gt;
&lt;br /&gt;
4.2&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;x = 0x403030, &amp;amp;y = 0x403020, diff(byte) = 16&lt;br /&gt;
&lt;br /&gt;
*x and y are now global variables, and are stored in a completely different area of memory&lt;br /&gt;
*There is now also a greater gap between the two variables&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;x = 0x10010a68, &amp;amp;y = 0x10010a6c, diff(byte) = -4&lt;br /&gt;
&lt;br /&gt;
*Variable order swapped around&lt;br /&gt;
*Only 4 bytes apart - same as when they were local variables&lt;br /&gt;
&lt;br /&gt;
4.3&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;x = 0x403040, &amp;amp;y = 0x403020, diff(bytes) = 32&lt;br /&gt;
 size of array = 4&lt;br /&gt;
 &amp;amp;arr = 0x403030, arr+4 = 0x403034, &amp;amp;arr[4] = 0x403034&lt;br /&gt;
 arr[4], diff (bytes) = 32&lt;br /&gt;
&lt;br /&gt;
*Again, different area of memory&lt;br /&gt;
*32 bytes in between (each variable seems to be taking 16 bytes of memory)&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;x = 0x10010b38, &amp;amp;y = 0x10010b40, diff(bytes) = -8&lt;br /&gt;
 size of array = 4&lt;br /&gt;
 &amp;amp;arr = 0x10010b3c, arr+4 = 0x10010b40, &amp;amp;arr[4] = 0x10010b40&lt;br /&gt;
 arr[4], diff (bytes) = -8&lt;br /&gt;
&lt;br /&gt;
*Different area of memory&lt;br /&gt;
*No extra usage of memory&lt;br /&gt;
*Order reversed&lt;br /&gt;
&lt;br /&gt;
Output for arr[0] - arr[10] (Windows):&lt;br /&gt;
&lt;br /&gt;
 arr[0], diff (bytes) = 32&lt;br /&gt;
 arr[1], diff (bytes) = 32&lt;br /&gt;
 arr[2], diff (bytes) = 32&lt;br /&gt;
 arr[3], diff (bytes) = 32&lt;br /&gt;
 arr[4], diff (bytes) = 32&lt;br /&gt;
 arr[5], diff (bytes) = 32&lt;br /&gt;
 arr[6], diff (bytes) = 32&lt;br /&gt;
 arr[7], diff (bytes) = 32&lt;br /&gt;
 arr[8], diff (bytes) = 32&lt;br /&gt;
 arr[9], diff (bytes) = 32&lt;br /&gt;
 arr[10], diff (bytes) = 32&lt;br /&gt;
&lt;br /&gt;
*Windows seems to be pretty consistent here, with 32 bytes between x and y regardless of the size of the array&lt;br /&gt;
&lt;br /&gt;
Output for arr[0] - arr[10] (Linux):&lt;br /&gt;
&lt;br /&gt;
 arr[0], diff (bytes) = -4&lt;br /&gt;
 arr[1], diff (bytes) = -8&lt;br /&gt;
 arr[2], diff (bytes) = -8&lt;br /&gt;
 arr[3], diff (bytes) = -8&lt;br /&gt;
 arr[4], diff (bytes) = -8&lt;br /&gt;
 arr[5], diff (bytes) = -12&lt;br /&gt;
 arr[6], diff (bytes) = -12&lt;br /&gt;
 arr[7], diff (bytes) = -12&lt;br /&gt;
 arr[8], diff (bytes) = -12&lt;br /&gt;
 arr[9], diff (bytes) = -4&lt;br /&gt;
 arr[10], diff (bytes) = -4&lt;br /&gt;
&lt;br /&gt;
*When the length of the array is 0, arr[0] and y shares the same addresses - i.e. the array isn&amp;#039;t allocated any memory&lt;br /&gt;
*For array length 1-8, the array is stored between x and y&lt;br /&gt;
*For array length 9-10, x and y are stored consecutively, and arr is shuffled to the end&lt;br /&gt;
&lt;br /&gt;
5.&lt;br /&gt;
*p1 and p2 stores the address of q and r respectively&lt;br /&gt;
&lt;br /&gt;
6.&lt;br /&gt;
&lt;br /&gt;
Windows&lt;br /&gt;
&lt;br /&gt;
 sp = 0x22cc70(456)&lt;br /&gt;
 sp = 0x22cc70(efg)&lt;br /&gt;
 sp = 0x402000(tuvwxyz)&lt;br /&gt;
 sp = 0x1062100(hijklmn)&lt;br /&gt;
&lt;br /&gt;
*Parts of the string seems to have been lost with the first two instances. This is probably due to local variables not being retained after the function finishes running&lt;br /&gt;
*Also local, static and malloc uses different parts of memory as shown&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
&lt;br /&gt;
 sp = 0xffcb09a4(�þîÐ�)&lt;br /&gt;
 sp = 0xffcb09a4(abcdefg)&lt;br /&gt;
 sp = 0x10010cc4(tuvwxyz)&lt;br /&gt;
 sp = 0x10011008(hijklmn)&lt;br /&gt;
&lt;br /&gt;
*Local, static and malloc uses different parts of memory as in Windows&lt;br /&gt;
*For some reason the second local string is retained while the first is lost completely!?&lt;br /&gt;
&lt;br /&gt;
Adding&lt;br /&gt;
&lt;br /&gt;
 strcpy( sp, &amp;quot;XXXXXXX&amp;quot;);&lt;br /&gt;
 printf( &amp;quot;sp X&amp;#039;d = %p(%s)\n&amp;quot;, sp, sp);&lt;br /&gt;
&lt;br /&gt;
to the code&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
 sp = 0x22cc70(456)&lt;br /&gt;
 sp X&amp;#039;d = 0x22cc70(-0@)&lt;br /&gt;
 sp = 0x22cc70(efg)&lt;br /&gt;
 sp X&amp;#039;d = 0x22cc70(-0@)&lt;br /&gt;
 sp = 0x402000(tuvwxyz)&lt;br /&gt;
 sp X&amp;#039;d = 0x402000(XXXXXXX)&lt;br /&gt;
 sp = 0xda2100(hijklmn)&lt;br /&gt;
 sp X&amp;#039;d = 0xda2100(XXXXXXX)&lt;br /&gt;
&lt;br /&gt;
*Can&amp;#039;t seem to X the area of memory where the local variable was stored&lt;br /&gt;
&lt;br /&gt;
Linux: &lt;br /&gt;
&lt;br /&gt;
 sp = 0xffa399a4(�þîÐ�)&lt;br /&gt;
 sp X&amp;#039;d = 0xffa399a4(XXXXXXX)&lt;br /&gt;
 sp = 0xffa399a4(abcdefg)&lt;br /&gt;
 sp X&amp;#039;d = 0xffa399a4(XXXXXXX)&lt;br /&gt;
 sp = 0x10010db0(tuvwxyz)&lt;br /&gt;
 sp X&amp;#039;d = 0x10010db0(XXXXXXX)&lt;br /&gt;
 sp = 0x10011008(hijklmn)&lt;br /&gt;
 sp X&amp;#039;d = 0x10011008(XXXXXXX)&lt;br /&gt;
&lt;br /&gt;
*Can seem to X the area of memory where the local variable was stored&lt;br /&gt;
&lt;br /&gt;
7.&lt;br /&gt;
&lt;br /&gt;
Output (Windows):&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;my_struct = 0x403020&lt;br /&gt;
 offsets:&lt;br /&gt;
 my_char: 0&lt;br /&gt;
 my_short: -2&lt;br /&gt;
 my_int: -4&lt;br /&gt;
 my_long: -8&lt;br /&gt;
 my_float: -12&lt;br /&gt;
 my_double: -16&lt;br /&gt;
&lt;br /&gt;
output (Linux):&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;my_struct = 0x10010ac0&lt;br /&gt;
 offsets:&lt;br /&gt;
 my_char: 0&lt;br /&gt;
 my_short: -2&lt;br /&gt;
 my_int: -4&lt;br /&gt;
 my_long: -8&lt;br /&gt;
 my_float: -12&lt;br /&gt;
 my_double: -16&lt;br /&gt;
&lt;br /&gt;
*Identical offsets to Windows&lt;br /&gt;
&lt;br /&gt;
8.&lt;br /&gt;
&lt;br /&gt;
Windows: &lt;br /&gt;
&lt;br /&gt;
 &amp;amp;my_struct = 0x403020&lt;br /&gt;
 offsets:&lt;br /&gt;
 my_char: 0&lt;br /&gt;
 my_short: 0&lt;br /&gt;
 my_int: 0&lt;br /&gt;
 my_long: 0&lt;br /&gt;
 my_float: 0&lt;br /&gt;
 my_double: 0&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;my_struct = 0x10010ab8&lt;br /&gt;
 offsets:&lt;br /&gt;
 my_char: 0&lt;br /&gt;
 my_short: 0&lt;br /&gt;
 my_int: 0&lt;br /&gt;
 my_long: 0&lt;br /&gt;
 my_float: 0&lt;br /&gt;
 my_double: 0&lt;br /&gt;
&lt;br /&gt;
*Unlike struct, there doesn&amp;#039;t seem to be any space preallocated for each variable&lt;br /&gt;
*Linux and Windows have same output barring difference in memory address&lt;br /&gt;
&lt;br /&gt;
9.&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
 *sp1 = 0xd920f0&lt;br /&gt;
 *sp2 = 0xda2108&lt;br /&gt;
 *sp3 = 0xd920f0&lt;br /&gt;
&lt;br /&gt;
*An area of memory that&amp;#039;s freed will be reused subsequently&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
 *sp1 = 0x10011008&lt;br /&gt;
 *sp2 = 0x10011018&lt;br /&gt;
 *sp3 = 0x10011008&lt;br /&gt;
&lt;br /&gt;
*This is also the case for Linux&lt;br /&gt;
&lt;br /&gt;
10.&lt;br /&gt;
&lt;br /&gt;
Using the code from 6)&lt;br /&gt;
&lt;br /&gt;
Windows:&lt;br /&gt;
&lt;br /&gt;
 local_str = 0x401050&lt;br /&gt;
 sp = 0x22cc70(456)&lt;br /&gt;
 sp X&amp;#039;d = 0x22cc70(=0@)&lt;br /&gt;
 sp = 0x22cc70(efg)&lt;br /&gt;
 sp X&amp;#039;d = 0x22cc70(=0@)&lt;br /&gt;
 sp = 0x402000(tuvwxyz)&lt;br /&gt;
 sp X&amp;#039;d = 0x402000(XXXXXXX)&lt;br /&gt;
 sp = 0xda20f8(hijklmn)&lt;br /&gt;
 sp X&amp;#039;d = 0xda20f8(XXXXXXX)&lt;br /&gt;
&lt;br /&gt;
*Seems to be somewhat close to where the static variables are stored&lt;br /&gt;
&lt;br /&gt;
Linux:&lt;br /&gt;
&lt;br /&gt;
 local_str = 0x100004dc&lt;br /&gt;
 sp = 0xffe8f9a4(0123456)&lt;br /&gt;
 sp X&amp;#039;d = 0xffe8f9a4(XXXXXXX)&lt;br /&gt;
 sp = 0xffe8f9a4(abcdefg)&lt;br /&gt;
 sp X&amp;#039;d = 0xffe8f9a4(XXXXXXX)&lt;br /&gt;
 sp = 0x10010df0(tuvwxyz)&lt;br /&gt;
 sp X&amp;#039;d = 0x10010df0(XXXXXXX)&lt;br /&gt;
 sp = 0x10011008(hijklmn)&lt;br /&gt;
 sp X&amp;#039;d = 0x10011008(XXXXXXX)&lt;br /&gt;
&lt;br /&gt;
*Near static variables and malloc space&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[User:Hpan027|Hpan027]] 15:56, 11 March 2008 (NZDT)&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>