SE250:lab-2:sbas046
Task 1
This task demonstrated that all pointers are 4 bytes irrespective of what they are pointing to.
Code
#include <stdio.h>
int main(void)
{
double *ip;
printf("The size of the pointer is = %d", sizeof(ip));
return 0;
}
Windows Output:
The size of the pointer is = 4
Linux Output:
The size of the pointer is = 4
Task 2
When using long predefined for each variable the answers are as expected. When using a single long predefinition for the substraction however you get the expected answers divided by 4.
Code
#include <stdio.h>
int main(void)
{
int x;
int y;
printf("The adress of x = %p\nThe adress of y = %p\nThe"
" difference of the adresses are = %ld\n", &x, &y, (long)&x- (long)&y);
printf("The adress of x = %p\nThe adress of y = %p\nThe"
" difference of the adresses are = %ld\n", &x, &y, (long)(&x- &y));
return 0;
}
Windows Output:
The adress of x = 0x22ccc4 The adress of y = 0x22ccbc The difference of the adresses are = 4 The difference of the adresses are = 1
Linux Output:
The adress of x = 0xff81072c The adress of y = 0xff810728 The difference of the adresses are = 4 The difference of the adresses are = 1
Task 3
This task demonstrates that if you initialise a value to the (n+x)th position of an array, where the array is n long and x is any integer greater than one, the value initialised will be written outside the array and may overwrite other variables in memory.
Code
#include <stdio.h>
int main(void)
{
int x;
char arr[4];
int y;
x=0;
y=0;
arr[4] = 10;
printf("The adress of x = %p\nThe adress of y = %p\nThe"
" difference of the adresses are = %ld\n", &x, &y, (long)&x- (long)&y);
printf("adress of arr = %p\n"
"adress of arr[4] = %p\n"
"value of arr+4 = %d\n",
&arr, &arr[4], arr[4]);
printf("x =%d\ny= %d", x, y);
return 0;
}
Windows Output:
The adress of x = 0x22ccc4 The adress of y = 0x22ccbc The difference of the adresses are = 8 adress of arr = 0x22ccc0 adress of arr[4] = 0x22ccc4 value of arr+4 = 10 x =10 y= 0
Linux Output:
The adress of x = 0x10010b64 The adress of y = 0x10010b68 The difference of the adresses are = -4 adress of arr = 0xffc4073c adress of arr[4] = 0xffc40740 value of arr+4 = 10 x = 0 y = 0
Task 4
This time the memory adresses are in a different sectors altogether and hence have vastly different values. Also making x and y global variables enables you to change the character array without it overwriting the x or y variables, this is because these variables are in different memory sectors.
Task 5
p1 is the adress of q p2 is the adress of r
Task 6
This task demonstrates the different sectors of memory used under different situations.
Code
#include <stdio.h>
char *local_str(){
char s[8] = "1234567";
return s;
}
char* local_str2(){
char s[8] = "abcdefg";
return s;
}
char *malloc_str(){
char *s = malloc(8);
strcpy(s, "hijklmn");
return s;
}
char *static_str(){
static char s[8] = "tuvwxyz";
return s;
}
int main (void)
{
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;
}
Windows Output:
sp = 0x22cc90(567) sp = 0x22cc90(efg) sp = 0x402000(tuvwxyz) sp = 0x10601a0(hijklmn)
Linux Output:
sp = 0xffb0f704( þîÐ►) sp = 0xffb0f704(abcdefg) sp = 0x10010cf8(tuvwxyz) sp = 0x10011008(hijklmn) local_str = 0x100004dc
Task 7
This task demonstrates the adresses the variables are stored within a structure. It also shows that the structure itself has a NULL adress. This is because its not actually storing anything, its just C's way of representing an structure and its not really a physical memory structure.
Code
#include <stdio.h>
struct
{
char my_char;
short my_short;
int my_int;
long my_long;
float my_float;
double my_double;
}my_struct;
int main (void)
{
printf("&my_struct = %p\n", my_struct);
printf("offsets:\n"
"my_char: %ld\n"
"my_short: %ld\n"
"my_int: %ld\n"
"my_long: %ld\n"
"my_float: %ld\n"
"my_double: %ld\n",
(long)&my_struct -(long)&my_struct.my_char,
(long)&my_struct-(long)&my_struct.my_short,
(long)&my_struct-(long)&my_struct.my_int,
(long)&my_struct-(long)&my_struct.my_long,
(long)&my_struct-(long)&my_struct.my_float,
(long)&my_struct-(long)&my_struct.my_double);
return 0;
}
Windows Output:
&my_struct = 0x0 offsets: my_char: 0 my_short: -2 my_int: -4 my_long: -8 my_float: -12 my_double: -16
Linux Output:
&my_struct = 0xff917710 offsets: my_char: 0 my_short: -2 my_int: -4 my_long: -8 my_float: -12 my_double: -16
Task 8
An union stacks the variables on top of each other. All the variables within the structure share the same adress
Task 9
This task demonstrates that if you free a malloced pointer it still points at the adress it was pointing to before but the memory is now unalocated.
Code
#include<stdio.h>
int main (void)
{
char *sp1, *sp2, *sp3;
sp1 = malloc( 10 );
printf("sp1 = %p\n"
"sp2 = %p\n"
"sp3 = %p\n\n",
sp1, sp2, sp3);
sp2 = malloc( 10 );
printf("sp1 = %p\n"
"sp2 = %p\n"
"sp3 = %p\n\n",
sp1, sp2, sp3);
free( sp1 );
printf("sp1 = %p\n"
"sp2 = %p\n"
"sp3 = %p\n\n",
sp1, sp2, sp3);
sp3 = malloc(10);
printf("sp1 = %p\n"
"sp2 = %p\n"
"sp3 = %p\n\n",
sp1, sp2, sp3);
return 0;
}
Windows Output:
gcc malloc.c -o malloc.exe && ./malloc.exe sp1 = 0x1060198 sp2 = 0x611021a0 sp3 = 0x0 sp1 = 0x1060198 sp2 = 0x10701b0 sp3 = 0x0 sp1 = 0x1060198 sp2 = 0x10701b0 sp3 = 0x0 sp1 = 0x1060198 sp2 = 0x10701b0 sp3 = 0x1060198
Linux Output:
malloc.c: In function 'main': malloc.c:7: warning: incompatible implicit declaration of built-in function 'mal loc' sp1 = 0x10011008 sp2 = 0xfffe39c4 sp3 = 0x1 sp1 = 0x10011008 sp2 = 0x10011018 sp3 = 0x1 sp1 = 0x10011008 sp2 = 0x10011018 sp3 = 0x1 sp1 = 0x10011008 sp2 = 0x10011018 sp3 = 0x10011008
Task 10
The functions are stored near the global variables in the actual code sector.
Code
#include <stdio.h>
char *local_str(){
char s[8] = "1234567";
return s;
}
char* local_str2(){
char s[8] = "abcdefg";
return s;
}
char *malloc_str(){
char *s = malloc(8);
strcpy(s, "hijklmn");
return s;
}
char *static_str(){
static char s[8] = "tuvwxyz";
return s;
}
int main (void)
{
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);
printf("local_str = %p\n\n", local_str);
return 0;
}
Windows Output:
sp = 0x22cc90(567) sp = 0x22cc90(efg) sp = 0x402000(tuvwxyz) sp = 0x10201a0(hijklmn) local_str = 0x401050
Linux Output:
sp = 0xffb0f704( þîÐ►) sp = 0xffb0f704(abcdefg) sp = 0x10010cf8(tuvwxyz) sp = 0x10011008(hijklmn) local_str = 0x100004dc