<?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%3Ahlin079</id>
	<title>SE250:lab-2:hlin079 - 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%3Ahlin079"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-2:hlin079&amp;action=history"/>
	<updated>2026-04-28T22:35:05Z</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:hlin079&amp;diff=4873&amp;oldid=prev</id>
		<title>Mark: 12 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-2:hlin079&amp;diff=4873&amp;oldid=prev"/>
		<updated>2008-11-03T05:18:58Z</updated>

		<summary type="html">&lt;p&gt;12 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;====lab 2====&lt;br /&gt;
This lab is about generating results on both windows and linux to understand the memory difference used for each c compiler. &lt;br /&gt;
====task1====&lt;br /&gt;
 int *1p;&lt;br /&gt;
 char *2p;&lt;br /&gt;
 float *3p;&lt;br /&gt;
 double *4p;&lt;br /&gt;
 short *5p;&lt;br /&gt;
 long *6p;&lt;br /&gt;
&lt;br /&gt;
 printf( &amp;quot;sizeof( int* ) = %d\n&amp;quot;, sizeof( 1p ) );&lt;br /&gt;
 printf( &amp;quot;sizeof( char* ) = %d\n&amp;quot;, sizeof( 2p ) );&lt;br /&gt;
 printf( &amp;quot;sizeof( float* ) = %d\n&amp;quot;, sizeof( 3p ) );&lt;br /&gt;
 printf( &amp;quot;sizeof( double* ) = %d\n&amp;quot;, sizeof( 4p ) );&lt;br /&gt;
 printf( &amp;quot;sizeof( short* ) = %d\n&amp;quot;, sizeof( 5p ) );&lt;br /&gt;
 printf( &amp;quot;sizeof( long* ) = %d\n&amp;quot;, sizeof( 6p ) );&lt;br /&gt;
&lt;br /&gt;
All the pointers have the same size for both windows and linux. the other data types in c have the same size as int, long, char,float.&lt;br /&gt;
&lt;br /&gt;
====task2====&lt;br /&gt;
 int x;&lt;br /&gt;
 int y;&lt;br /&gt;
 printf(&amp;quot;&amp;amp;x=%p,&amp;amp;y=%p, diff=%1d\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=%1d\n&amp;quot;,&amp;amp;x,&amp;amp;y,((long)&amp;amp;x-(long)&amp;amp;y));&lt;br /&gt;
&lt;br /&gt;
 For the windows&lt;br /&gt;
   &amp;amp;x=0x22ccbc,&amp;amp;y=0x22ccb4, diff=2&lt;br /&gt;
   &amp;amp;x=0x22ccbc,&amp;amp;y=0x22ccb4, diff=8&lt;br /&gt;
 For the Linux&lt;br /&gt;
   &amp;amp;x=0xffa8374c,&amp;amp;y=0xffa83744, diff=2&lt;br /&gt;
   &amp;amp;x=0xffa8374c,&amp;amp;y=0xffa83744, diff=8&lt;br /&gt;
The (long )&amp;amp;x-(long)&amp;amp;y gives the bits difference .&lt;br /&gt;
The (long)&amp;amp;x-&amp;amp;y gives the interget difference.&lt;br /&gt;
&lt;br /&gt;
====task3====&lt;br /&gt;
 int x;  &lt;br /&gt;
 char arr[4]; &lt;br /&gt;
 int y;  &lt;br /&gt;
 int x2;  &lt;br /&gt;
 char arr1[10];&lt;br /&gt;
 int y2;  &lt;br /&gt;
 printf(&amp;quot;&amp;amp;x=%p,&amp;amp;y=%p, diff=%1d\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=%1d\n&amp;quot;,&amp;amp;x,&amp;amp;y,((long)&amp;amp;x-(long)&amp;amp;y));  &lt;br /&gt;
 printf(&amp;quot;size of arr is %d\n&amp;quot;, sizeof(arr)); &lt;br /&gt;
 printf(&amp;quot;&amp;amp;arr=%p, arr+4=%p,&amp;amp;arr[4]=%p\n&amp;quot;,&amp;amp;arr, arr+4,&amp;amp;arr[4]); &lt;br /&gt;
 printf(&amp;quot;&amp;amp;x2=%p,&amp;amp;y2=%p, diff2=%1d\n&amp;quot;,&amp;amp;x2,&amp;amp;y2,(long)(&amp;amp;x2-&amp;amp;y2));  &lt;br /&gt;
 printf(&amp;quot;&amp;amp;x2=%p,&amp;amp;y2=%p, diff2=%1d\n&amp;quot;,&amp;amp;x2,&amp;amp;y2,((long)&amp;amp;x2-(long)&amp;amp;y2));  &lt;br /&gt;
 printf(&amp;quot;size of arr1 is %d\n&amp;quot;, sizeof(arr1));  &lt;br /&gt;
 printf(&amp;quot;&amp;amp;arr1=%p, arr1+4=%p,&amp;amp;arr1[4]=%p\n&amp;quot;,&amp;amp;arr1, arr1+4,&amp;amp;arr1[4]);  &lt;br /&gt;
&lt;br /&gt;
For the windows i got&lt;br /&gt;
 &amp;amp;x=0x22ccbc,&amp;amp;y=0x22ccb4, diff=2&lt;br /&gt;
 &amp;amp;x=0x22ccbc,&amp;amp;y=0x22ccb4, diff=8&lt;br /&gt;
 size of arr is 4&lt;br /&gt;
 &amp;amp;arr=0x22ccb8, arr+4=0x22ccbc,&amp;amp;arr[4]=0x22ccbc&lt;br /&gt;
 &amp;amp;x2=0x22ccb0,&amp;amp;y2=0x22cc9c, diff2=5&lt;br /&gt;
 &amp;amp;x2=0x22ccb0,&amp;amp;y2=0x22cc9c, diff2=20&lt;br /&gt;
 size of arr1 is 10&lt;br /&gt;
 &amp;amp;arr1=0x22cca0, arr1+4=0x22cca4,&amp;amp;arr1[4]=0x22cca4&lt;br /&gt;
For the linux i got&lt;br /&gt;
 &amp;amp;x=0xffa8374c,&amp;amp;y=0xffa83744, diff=2&lt;br /&gt;
 &amp;amp;x=0xffa8374c,&amp;amp;y=0xffa83744, diff=8&lt;br /&gt;
 size of arr is 4&lt;br /&gt;
 &amp;amp;arr=0xffa83748, arr+4=0xffa8374c,&amp;amp;arr[4]=0xffa8374c&lt;br /&gt;
 &amp;amp;x2=0xffa83740,&amp;amp;y2=0xffa8373c, diff2=1&lt;br /&gt;
 &amp;amp;x2=0xffa83740,&amp;amp;y2=0xffa8373c, diff2=4&lt;br /&gt;
 size of arr1 is 10&lt;br /&gt;
 &amp;amp;arr1=0xffa83752, arr1+4=0xffa83756,&amp;amp;arr1[4]=0xffa83756&lt;br /&gt;
====task4====&lt;br /&gt;
 int x3;&lt;br /&gt;
 char arr2[4];&lt;br /&gt;
 int y3;&lt;br /&gt;
 int main(){&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;&amp;amp;x3=%p,&amp;amp;y3=%p, diff3=%1d\n&amp;quot;,&amp;amp;x3,&amp;amp;y3,(long)(&amp;amp;x3-&amp;amp;y3));&lt;br /&gt;
    printf(&amp;quot;&amp;amp;x3=%p,&amp;amp;y3=%p, diff3=%1d\n&amp;quot;,&amp;amp;x,&amp;amp;y,((long)&amp;amp;x3-(long)&amp;amp;y3));&lt;br /&gt;
    printf(&amp;quot;size of arr2 is %d\n&amp;quot;, sizeof(arr2));&lt;br /&gt;
    printf(&amp;quot;&amp;amp;arr2=%p, arr2+4=%p,&amp;amp;arr2[4]=%p\n&amp;quot;,&amp;amp;arr2, arr2+4,&amp;amp;arr2[4]);&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
For the windows:&lt;br /&gt;
 &amp;amp;x3=0x403040,&amp;amp;y3=0x403030, diff3=4&lt;br /&gt;
 &amp;amp;x3=0x22ccbc,&amp;amp;y3=0x22ccb4, diff3=16&lt;br /&gt;
 size of arr2 is 4&lt;br /&gt;
 &amp;amp;arr2=0x403020, arr2+4=0x403024,&amp;amp;arr2[4]=0x403024&lt;br /&gt;
For the linux:&lt;br /&gt;
 &amp;amp;x3=0x10010d90,&amp;amp;y3=0x10010d94, diff3=-1&lt;br /&gt;
 &amp;amp;x3=0xffa8374c,&amp;amp;y3=0xffa83744, diff3=-4&lt;br /&gt;
 size of arr2 is 4&lt;br /&gt;
 &amp;amp;arr2=0x10010d8c, arr2+4=0x10010d90,&amp;amp;arr2[4]=0x10010d90&lt;br /&gt;
&lt;br /&gt;
I think the result for linux is negatve because linux works in the other order.&lt;br /&gt;
====task5====&lt;br /&gt;
&lt;br /&gt;
 int *p1, *p2;&lt;br /&gt;
 int q;&lt;br /&gt;
 p1 = &amp;amp;q;&lt;br /&gt;
 int r;&lt;br /&gt;
 p2 = &amp;amp;r;&lt;br /&gt;
 printf(&amp;quot;p1 = %p, p2 = %p&amp;quot;, p1, p2);&lt;br /&gt;
&lt;br /&gt;
For windows:&lt;br /&gt;
 p1=0x22ccbc, p2=0x22ccb8&lt;br /&gt;
For the linux:&lt;br /&gt;
 p1=0xffc80754, p2=0xffc80750&lt;br /&gt;
&lt;br /&gt;
====task6====&lt;br /&gt;
&lt;br /&gt;
 char *local_str() { &lt;br /&gt;
 char s[8] = &amp;quot;0123456&amp;quot;;&lt;br /&gt;
   return s;&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
 char *local_str2() { &lt;br /&gt;
 char s[8] = &amp;quot;abcdefg&amp;quot;;&lt;br /&gt;
 return s;&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
 char *static_str() { &lt;br /&gt;
 char s[8] = &amp;quot;tuvwxyz&amp;quot;;&lt;br /&gt;
 return s;&lt;br /&gt;
 } &lt;br /&gt;
 char *malloc_str() { &lt;br /&gt;
 char *s = malloc(8);&lt;br /&gt;
 strcpy(s, &amp;quot;hijklmn&amp;quot;);&lt;br /&gt;
 return s;&lt;br /&gt;
 } &lt;br /&gt;
 int main (void)&lt;br /&gt;
    &lt;br /&gt;
 {&lt;br /&gt;
 char *sp;&lt;br /&gt;
 sp = local_str( );&lt;br /&gt;
 printf( &amp;quot;sp = %p(%s)\n&amp;quot;, sp, sp );&lt;br /&gt;
 trcpy(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;
 sp = local_str();&lt;br /&gt;
 local_str2();&lt;br /&gt;
 printf( &amp;quot;sp = %p(%s)\n&amp;quot;, sp, sp );&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;
 sp = static_str();&lt;br /&gt;
 local_str2();&lt;br /&gt;
 printf( &amp;quot;sp = %p(%s)\n&amp;quot;, sp, sp );&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;
 sp = malloc_str();&lt;br /&gt;
 local_str2();&lt;br /&gt;
 printf( &amp;quot;sp = %p(%s)\n&amp;quot;, sp, sp );&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;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
For the Windows:&lt;br /&gt;
sp = 0x22cc90(456) sp X&amp;#039;d = 0x22cc90(-0@) sp = 0x22cc90(efg) sp X&amp;#039;d = 0x22cc90(-0@) sp = 0x402000(tuvwxyz) sp X&amp;#039;d = 0x402000(XXXXXXX) sp = 0xda0170(hijklmn) sp X&amp;#039;d = 0xda0170(XXXXXXX)&lt;br /&gt;
For Linux: &lt;br /&gt;
sp = 0xffaa1724( þîÐ►) sp X&amp;#039;d = 0xffaa1724(XXXXXXX) sp = 0xffaa1724(abcdefg) sp X&amp;#039;d = 0xffaa1724(XXXXXXX) sp = 0x10010dc0(tuvwxyz) sp X&amp;#039;d = 0x10010dc0(XXXXXXX) sp = 0x10011008(hijklmn) sp X&amp;#039;d = 0x10011008(XXXXXXX) &lt;br /&gt;
====task7====&lt;br /&gt;
 typedef struct{&lt;br /&gt;
 char my_char;&lt;br /&gt;
 short my_short;&lt;br /&gt;
 int my_int;&lt;br /&gt;
 long my_long;&lt;br /&gt;
 float my_float;&lt;br /&gt;
 double my_double;&lt;br /&gt;
 }my_struct;&lt;br /&gt;
 int main(){&lt;br /&gt;
 my_struct as;&lt;br /&gt;
 printf(&amp;quot;&amp;amp;my_struct=%p\n&amp;quot;, &amp;amp;as);&lt;br /&gt;
 printf(&amp;quot;offsets:\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_char:%1d\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_short:%1d\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_int:%1d\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_long:%1d\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_float:%1d\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_double:%1d\n&amp;quot;,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_char,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_short,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_int,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_long,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_float,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_double);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
Results: Windows: offsets: my_char: 0 my_short: -2 my_int: -4 my_long: -8 my_float: -12 my_double: -16 &lt;br /&gt;
&lt;br /&gt;
Linux: &amp;amp;my struct = 0xffae2740 offsets: my_char: 0 my_short: -2 my_int: -4 my_long: -8 my_float: -12 my_double: -16 &lt;br /&gt;
&lt;br /&gt;
====task8====&lt;br /&gt;
 typedef union{&lt;br /&gt;
 char my_char;&lt;br /&gt;
 short my_short;&lt;br /&gt;
 int my_int;&lt;br /&gt;
 long my_long;&lt;br /&gt;
 float my_float;&lt;br /&gt;
 double my_double;&lt;br /&gt;
 }my_struct;&lt;br /&gt;
 int main(){&lt;br /&gt;
 my_struct as;&lt;br /&gt;
 printf(&amp;quot;&amp;amp;my_struct=%p\n&amp;quot;, &amp;amp;as);&lt;br /&gt;
 printf(&amp;quot;offsets:\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_char:%1d\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_short:%1d\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_int:%1d\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_long:%1d\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_float:%1d\n&amp;quot;&lt;br /&gt;
 &amp;quot;my_double:%1d\n&amp;quot;,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_char,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_short,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_int,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_long,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_float,&lt;br /&gt;
 (long)&amp;amp;as-(long)&amp;amp;as.my_double);&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Results: Windows: offsets: my_char: 0 my_short: 0 my_int: 0 my_long: 0 my_float: 0 my_double: 0 &lt;br /&gt;
&lt;br /&gt;
Linux: offsets: my_char: 0 my_short: 0 my_int: 0 my_long: 0 my_float: 0 my_double: 0 &lt;br /&gt;
I think the union saved all the data in the same space, but the struct saved each data in different space.&lt;br /&gt;
====task9====&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    char *sp1, *sp2, *sp3;&lt;br /&gt;
    sp1 = malloc( 10 );&lt;br /&gt;
    sp2 = malloc( 10 );&lt;br /&gt;
    printf(&amp;quot;Address of sp1 = %p.  Address of sp2 - %p.\n&amp;quot;, sp1, sp2);&lt;br /&gt;
    printf(&amp;quot;sp1 = %s\n&amp;quot;, sp1);&lt;br /&gt;
    free( sp1 );&lt;br /&gt;
    sp1[6] = &amp;#039;d&amp;#039;;&lt;br /&gt;
    printf(&amp;quot;sp1 = %s\n&amp;quot;, sp1);&lt;br /&gt;
    sp3 = malloc( 10 );&lt;br /&gt;
    printf(&amp;quot;Address of sp1 = %p.  Address of sp2 - %p. Address of sp3 - %p\n&amp;quot;, sp1, sp2, sp3);&lt;br /&gt;
&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
Results: Windows: &lt;br /&gt;
Address of sp1 = 0x1040198. Address of sp2 - 0x10401a8. sp1 = sp1 = ԝ aԝda Address of sp1 = 0x1040198. Address of sp2 - 0x10401a8. Address of sp3 - 0x1040198 &lt;br /&gt;
Address of sp1 = 0xf70198. Address of sp2 - 0xf701a8. sp1 = sp1 = ԝ aԝda Address of sp1 = 0xf70198. Address of sp2 - 0xf701a8. Address of sp3 - 0xf70198 &lt;br /&gt;
Address of sp1 = 0xd90198. Address of sp2 - 0xd901a8. sp1 = sp1 = ԝ aԝda Address of sp1 = 0xd90198. Address of sp2 - 0xd901a8. Address of sp3 - 0xd90198 &lt;br /&gt;
Address of sp1 = 0xd90198. Address of sp2 - 0xd901a8. sp1 = sp1 = ԝ aԝda Address of sp1 = 0xd90198. Address of sp2 - 0xd901a8. Address of sp3 - 0xd90198 &lt;br /&gt;
Address of sp1 = 0xfa0198. Address of sp2 - 0xfa01a8. sp1 = sp1 = ԝ aԝda Address of sp1 = 0xfa0198. Address of sp2 - 0xfa01a8. Address of sp3 - 0xfa0198 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Linux: Address of sp1 = 0x10011008. Address of sp2 - 0x10011018. sp1 = sp1 = Address of sp1 = 0x10011008. Address of sp2 - 0x10011018. Address of sp3 - 0x10 011008 &lt;br /&gt;
&lt;br /&gt;
At the beginning the sp1 and sp3 have their own memory location but after sp1 was freed the address of memory sp1 was pointing to where sp3 was pointing to. &lt;br /&gt;
&lt;br /&gt;
====task10====&lt;br /&gt;
For the windows: 0x401050&lt;br /&gt;
&lt;br /&gt;
For the linux: 0x100004dc&lt;br /&gt;
&lt;br /&gt;
====I hated this lab.  The lab took me so long to complete=====&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>