Write a C program to demonstrate the difference between structures and unions.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* structure with integer and character array data elements */
struct empStruct {
int age;
char name[32];
};
/* union with integer and character array data elements */
union empUnion {
int age;
char name[32];
};
int main() {
struct empStruct emp1;
union empUnion emp2;
/*
* size of structure is equal to the sum of size of all
* elements in the structure. Size of Union is the size
* of largest element in the union.
*/
printf("First Difference - Size:\n");
printf("Structure empStruct:\n");
printf("sizeof(struct empStruct): %d\n", sizeof(struct empStruct));
printf("sizeof(emp1.age): %d\n", sizeof(emp1.age));
printf("sizeof(emp1.name): %d\n", sizeof(emp1.name));
printf("sizeof(struct empStruct) <=> "
"sizeof(emp1.age) + sizeof(emp1.name)\n\n");
printf("Union empUnion:\n");
printf("Size of Union(empUnion): %d\n", sizeof(union empUnion));
printf("sizeof(emp2.age): %d\n", sizeof(emp2.age));
printf("sizeof(emp2.name): %d\n", sizeof(emp2.name));
printf("sizeof(struct empStruct) <=> "
"sizeof(emp2.name)[type with large size]\n");
/*
* only one element can be accessed at a time in union.
* All variables can be accessed at a time in structure.
*/
printf("\nSecond Difference - Access Permission:\n");
printf("Assigning 21 to emp1.age\n");
emp1.age = 21;
printf("Assiging Ram to emp1.name\n");
strcpy(emp1.name, "Ram");
printf("\nContents in struct empStruct:\n");
printf("struct empStruct {\n");
printf("\tage = %d\n", emp1.age);
printf("\tname = %s\n};\n\n", emp1.name);
printf("Assigning 21 to emp2.age\n");
emp2.age = 21;
printf("Assigning ABCDEFG to emp2.name\n");
/*
* contents in emp2.name will overwrite the contents in
* emp2.age. Check the output for better understanding. So,
* emp2.age will have 0x41424344. Its nothing but the
* ASCII values of A, B, C and D. Size of integer is 4 bytes
* So, emp2.age will have first 4 characters in emp2.name
*/
strcpy(emp2.name, "ABCDEFG");
printf("\nContents in union empUnion:\n");
printf("union empUnion {\n");
printf("\tage = 0x%x\n", emp2.age);
printf("\tname = %s\n};\n\n", emp2.name);
printf("\nASCII value of A: 0x%x\n", 'A');
printf("ASCII value of B: 0x%x\n", 'B');
printf("ASCII value of C: 0x%x\n", 'C');
printf("ASCII value of D: 0x%x\n", 'D');
return 0;
}
#include <stdlib.h>
#include <string.h>
/* structure with integer and character array data elements */
struct empStruct {
int age;
char name[32];
};
/* union with integer and character array data elements */
union empUnion {
int age;
char name[32];
};
int main() {
struct empStruct emp1;
union empUnion emp2;
/*
* size of structure is equal to the sum of size of all
* elements in the structure. Size of Union is the size
* of largest element in the union.
*/
printf("First Difference - Size:\n");
printf("Structure empStruct:\n");
printf("sizeof(struct empStruct): %d\n", sizeof(struct empStruct));
printf("sizeof(emp1.age): %d\n", sizeof(emp1.age));
printf("sizeof(emp1.name): %d\n", sizeof(emp1.name));
printf("sizeof(struct empStruct) <=> "
"sizeof(emp1.age) + sizeof(emp1.name)\n\n");
printf("Union empUnion:\n");
printf("Size of Union(empUnion): %d\n", sizeof(union empUnion));
printf("sizeof(emp2.age): %d\n", sizeof(emp2.age));
printf("sizeof(emp2.name): %d\n", sizeof(emp2.name));
printf("sizeof(struct empStruct) <=> "
"sizeof(emp2.name)[type with large size]\n");
/*
* only one element can be accessed at a time in union.
* All variables can be accessed at a time in structure.
*/
printf("\nSecond Difference - Access Permission:\n");
printf("Assigning 21 to emp1.age\n");
emp1.age = 21;
printf("Assiging Ram to emp1.name\n");
strcpy(emp1.name, "Ram");
printf("\nContents in struct empStruct:\n");
printf("struct empStruct {\n");
printf("\tage = %d\n", emp1.age);
printf("\tname = %s\n};\n\n", emp1.name);
printf("Assigning 21 to emp2.age\n");
emp2.age = 21;
printf("Assigning ABCDEFG to emp2.name\n");
/*
* contents in emp2.name will overwrite the contents in
* emp2.age. Check the output for better understanding. So,
* emp2.age will have 0x41424344. Its nothing but the
* ASCII values of A, B, C and D. Size of integer is 4 bytes
* So, emp2.age will have first 4 characters in emp2.name
*/
strcpy(emp2.name, "ABCDEFG");
printf("\nContents in union empUnion:\n");
printf("union empUnion {\n");
printf("\tage = 0x%x\n", emp2.age);
printf("\tname = %s\n};\n\n", emp2.name);
printf("\nASCII value of A: 0x%x\n", 'A');
printf("ASCII value of B: 0x%x\n", 'B');
printf("ASCII value of C: 0x%x\n", 'C');
printf("ASCII value of D: 0x%x\n", 'D');
return 0;
}
Output:
jp@jp-VirtualBox:~/$ ./a.out
First Difference - Size:
Structure empStruct:
sizeof(struct empStruct): 36
sizeof(emp1.age): 4
sizeof(emp1.name): 32
sizeof(struct empStruct) <=> sizeof(emp1.age) + sizeof(emp1.name)
Union empUnion:
Size of Union(empUnion): 32
sizeof(emp2.age): 4
sizeof(emp2.name): 32
sizeof(struct empStruct) <=> sizeof(emp2.name)[type with large size]
Second Difference - Access Permission:
Assigning 21 to emp1.age
Assiging Ram to emp1.name
Contents in struct empStruct:
struct empStruct {
age = 21
name = Ram
};
Assigning 21 to emp2.age
Assigning ABCDEFG to emp2.name
Contents in union empUnion:
union empUnion {
age = 0x41424344 //ASCII value of A,B,C & D
name = ABCDEFG
};
ASCII value of A: 0x41
ASCII value of B: 0x42
ASCII value of C: 0x43
ASCII value of D: 0x44
First Difference - Size:
Structure empStruct:
sizeof(struct empStruct): 36
sizeof(emp1.age): 4
sizeof(emp1.name): 32
sizeof(struct empStruct) <=> sizeof(emp1.age) + sizeof(emp1.name)
Union empUnion:
Size of Union(empUnion): 32
sizeof(emp2.age): 4
sizeof(emp2.name): 32
sizeof(struct empStruct) <=> sizeof(emp2.name)[type with large size]
Second Difference - Access Permission:
Assigning 21 to emp1.age
Assiging Ram to emp1.name
Contents in struct empStruct:
struct empStruct {
age = 21
name = Ram
};
Assigning 21 to emp2.age
Assigning ABCDEFG to emp2.name
Contents in union empUnion:
union empUnion {
age = 0x41424344 //ASCII value of A,B,C & D
name = ABCDEFG
};
ASCII value of A: 0x41
ASCII value of B: 0x42
ASCII value of C: 0x43
ASCII value of D: 0x44
No comments:
Post a Comment