SE250:lab-2:mabd065
Lab2
1. running printf("%d\n",sizeof(ip)) where ip is a pointer of type int gives the value 4 (i.e. 4 bytes).
Other types:
On the PC:
Short: 4 Float: 4 Double: 4 char: 4
On Linux:
Short: 4 Float: 4 Double: 4 char: 4
Looking at the results, all types above have the same size!!
I have tried to use %lg in the printf instead of %d and got some strange results (1.97626e-323 for Char!).
2. Executing (long) (&x - &y) gives:
PC:
&x = 0x22ccc4, &y = 0x22ccc0, diff = 1
Linux:
&x = 0xffb8c71c, &y = 0xffb8c718, diff = 1
Executing (long)&x - (long)&y gives:
PC:
&x = 0x22ccc4, &y = 0x22ccc0, diff = 4
Linux:
&x = 0xffbb371c, &y = 0xffbb3718, diff = 4
3.
Size of array on the PC & on linux is: 4
PC:
&arr = 0x22ccc0 arr+4 = 0x22ccc4 &arr[4] = 0x22ccc4
Linux:
&arr = 0xffdc9714 arr+4 = 0xffaa8718 &arr[4] = 0xff945718
CODE:
#include <stdio.h> int main () { int x; char arr[10]; int y; printf("&x = %p, &y = %p, diff = %ld \n", &x, &y, (long)(&x - &y)); return 0; }
Difference between x & y when arr is zero:
Arr = 0:
On PC: &x = 0x22ccbc, &y = 0x22cc9c, diff = 8 On linux: &x = 0xffb6871c, &y = 0xffb68718, diff = 1
Arr = 1:
PC: &x = 0x22ccc4, &y = 0x22ccbc, diff = 2 Linux: &x = 0xff883718, &y = 0xff883714, diff = 1
Arr = 2:
PC: &x = 0x22ccc4, &y = 0x22ccbc, diff = 2 Linux: &x = 0xff9c9718, &y = 0xff9c9714, diff = 1
Arr = 3:
PC: &x = 0x22ccbc, &y = 0x22cc9c, diff = 8 Linux: &x = 0xff8f9718, &y = 0xff8f9714, diff = 1
Arr = 4:
PC: &x = 0x22ccc4, &y = 0x22ccbc, diff = 2 Linux: &x = 0xff96371c, &y = 0xff963714, diff = 2
Arr = 5:
PC: &x = 0x22ccbc, &y = 0x22cc9c, diff = 8 Linux: &x = 0xffc0871c, &y = 0xffc08718, diff = 1
Arr = 6:
PC: &x = 0x22ccbc, &y = 0x22cc9c, diff = 8 Linux: &x = 0xffba171c, &y = 0xffba1718, diff = 1
Arr = 7:
PC: &x = 0x22ccbc, &y = 0x22cc9c, diff = 8 Linux: &x = 0xffd2a71c, &y = 0xffd2a718, diff = 1
Arr = 8:
PC: &x = 0x22ccc4, &y = 0x22ccb4, diff = 4 Linux: &x = 0xffe98710, &y = 0xffe9870c, diff = 1
Arr = 9:
PC: &x = 0x22ccbc, &y = 0x22cc9c, diff = 8 Linux: &x = 0xffc0670c, &y = 0xffc06708, diff = 1
Arr = 10:
PC: &x = 0x22ccbc, &y = 0x22cc9c, diff = 8 Linux: &x = 0xfff0770c, &y = 0xfff07708, diff = 1
After reverting Arr to size 4,
CODE:
#include <stdio.h> int main () { int x = 0; char arr[4]; arr[4] = 10; int y = 0; printf("&x = %p, &y = %p, diff = %ld \n", &x, &y, (long)(&x - &y));
return 0; }
I got the following:
PC: x = 10, y = 0 Linux: x = 167772160, y = 0
4.
Repeat of task2:
CODE:
#include <stdio.h> int x; int y; int main () { printf("&x = %p, &y = %p, diff = %ld \n", &x, &y, (long)( &x - &y)); return 0; }
Executing (long) (&x - &y) gives:
PC: &x = 0x403030, &y = 0x403020, diff = 4 Linux: &x = 0x10010a64, &y = 0x10010a68, diff = -1
Executing (long)&x - (long)&y gives:
PC: &x = 0x403030, &y = 0x403020, diff = 16 Linux: &x = 0x10010a64, &y = 0x10010a68, diff = -4
Repeat of task3:
Size of array on the PC & on linux is: 4
PC:
&arr = 0x403030 arr+4 = 0x403034 &arr[4] = 0x403034
Linux:
&arr = 0x10010a44 arr+4 = 0x10010a48 &arr[4] = 0x10010a48
CODE:
#include <stdio.h> int x; char arr[4]; int y; int main () { printf("size of size of &arr = %p \n", &arr[4]); return 0; }
Difference between x & y when arr is zero:
Arr = 0:
On PC: &x = 0x403040, &y = 0x403020, diff = 8 On linux: &x = 0x10010a64, &y = 0x10010a68, diff = -1
Arr = 1:
PC: &x = 0x403040, &y = 0x403020, diff = 8 Linux: &x = 0x403040, &y = 0x403020, diff = 8
Arr = 2:
PC: &x = 0x403040, &y = 0x403020, diff = 8 Linux: &x = 0x10010a64, &y = 0x10010a6c, diff = -2
Arr = 3:
PC: &x = 0x403040, &y = 0x403020, diff = 8 Linux: &x = 0x10010a64, &y = 0x10010a6c, diff = -2
Arr = 4:
PC: &x = 0x403040, &y = 0x403020, diff = 8 Linux: &x = 0x10010a64, &y = 0x10010a6c, diff = -2
Arr = 5:
PC: &x = 0x403040, &y = 0x403020, diff = 8 Linux: &x = 0x10010a64, &y = 0x10010a70, diff = -3
Arr = 6:
PC: &x = 0x403040, &y = 0x403020, diff = 8 Linux: &x = 0x10010a64, &y = 0x10010a70, diff = -3
Arr = 7:
PC: &x = 0x403040, &y = 0x403020, diff = 8 Linux: &x = 0x10010a64, &y = 0x10010a70, diff = -3
Arr = 8:
PC: &x = 0x403040, &y = 0x403020, diff = 8 Linux: &x = 0x10010a64, &y = 0x10010a70, diff = -3
Arr = 9:
PC: &x = 0x403040, &y = 0x403020, diff = 8 Linux: &x = 0x10010a64, &y = 0x10010a68, diff = -1
Arr = 10:
PC: &x = 0x403040, &y = 0x403020, diff = 8 Linux: &x = 0x10010a64, &y = 0x10010a68, diff = -1
After reverting Arr to size 4,
CODE:
#include <stdio.h> int main () { int x = 0; char arr[4]; arr[4] = 10; int y = 0; printf("&x = %p, &y = %p, diff = %ld \n", &x, &y, (long)(&x - &y));
return 0; }
I got the following:
PC: x = 0, y = 0 Linux: x = 0, y = 0
CODE:
#include <stdio.h> int x=0; char arr[4]; int y=0;
int main () { arr[4] = 10; printf("x = %d, y = %d\n", x, y); return 0; }
5.
p1 = 2280636 (0x22ccc4), p2 = 2280632 (0x22ccc0) q = 0 (0x22ccbc), r = 1628704768 (0x22ccb8)
CODE:
#include <stdio.h> int main () { int *p1,*p2; int q, r; p1 = &q; p2 = &r; printf("p1 = %d (%p), p2 = %d (%p)\n", p1, &p1, p2, &p2); printf("q = %d (%p), r = %d (%p)\n", q, &q, r, &r); return 0; }
6. Results:
sp = 0x22cc90(456) sp = 0x22cc90(efg) sp = 0x22cc90(tuvwxyz) sp = 0xda01a0(hijklmn)
CODE:
#include <stdio.h> #include <string.h> char *local_str() { char s[8] = "0123456"; return s; } char *local_str2() { char s[8] = "abcdefg"; return s; } char *static_str() { static char s[8] = "tuvwxyz"; return s; } char *malloc_str() { char *s = malloc(8); strcpy(s, "hijklmn"); return s; } int main () { char *sp; sp = local_str(); printf("sp = %p(%s)\n", sp, sp); sp = local_str(); local_str2(); printf("sp = %p(%s)\n", sp, sp); sp = static_str(); local_str2(); printf("sp = %p(%s)\n", sp, sp); sp = malloc_str(); local_str2(); printf("sp = %p(%s)\n", sp, sp); return 0; }
After adding the extra code, the results are:
sp = 0x22cc90(456) sp X'd = 0x22cc90(5 @) sp = 0x22cc90(efg) sp X'd = 0x22cc90(5 @) sp = 0x22cc90(tuvwxyz) sp X'd = 0x22cc90(XXXXXXX) sp = 0x10101a0(hijklmn) sp X'd = 0x10101a0(XXXXXXX)
#include <stdio.h> #include <string.h> char *local_str() { char s[8] = "0123456"; return s; } char *local_str2() { char s[8] = "abcdefg"; return s; } char *static_str() { static char s[8] = "tuvwxyz"; return s; } char *malloc_str() { char *s = malloc(8); strcpy(s, "hijklmn"); return s; } int main () { char *sp; sp = local_str(); printf("sp = %p(%s)\n", sp, sp); strcpy(sp, "XXXXXXX"); printf("sp X'd = %p(%s)\n", sp, sp); sp = local_str(); local_str2(); printf("sp = %p(%s)\n", sp, sp); strcpy(sp, "XXXXXXX"); printf("sp X'd = %p(%s)\n", sp, sp); sp = static_str(); local_str2(); printf("sp = %p(%s)\n", sp, sp); strcpy(sp, "XXXXXXX"); printf("sp X'd = %p(%s)\n", sp, sp); sp = malloc_str(); local_str2(); printf("sp = %p(%s)\n", sp, sp); strcpy(sp, "XXXXXXX"); printf("sp X'd = %p(%s)\n", sp, sp); return 0; }
--Mabd065 13:35, 11 March 2008 (NZDT)