ما هي الـ Structure؟
هي مجموعة من البيانات المتعلقة ببعضها البعض تحت اسم واحد, يمكن أن يكونوا من نفس نوع البيانات أو لا
struct Rectangle {
int length; // 4 byte
int width; // 4 byte
// total = 8 byte
};
في هذه اللحظة هي لا تحجز اي مساحة في ال memory بسبب انه فقط تعريف لل struct
اذا قمنا بتعريف متغير من هذا النوع سوف يحجز مساحة في ال memory مقدارها 8 BYTE
حجم ال STRUCT: مجموع المساحة التي يشغلها عناصرها, في هذه الحالة 4+4 = 8 byte
الان سنقوم بانشاء متغير من نوع struct
#include<stdio.h>
struct Rectangle {
int length; // 4 byte
int width; // 4 byte
};
int main() {
struct Rectangle r; // declaration
printf("%d", sizeof(r)); // 8 Byte
struct Rectangle x = {10, 15}; // declaration + initialization
return 0;
}

الوصول إلى عناصر Structure
نصل الى عناصر ال struct عن طريق dot operator(.)
#include<stdio.h>
struct Rectangle {
int length; // 4 byte
int width; // 4 byte
};
int AreaOfRectangle(int length, int width);
int main() {
struct Rectangle r = {10, 15}; // declaration + initialization
r.length = 20;
r.width = 4;
printf("the Area of Rectangle is: %d",AreaOfRectangle(r.length, r.width));
return 0;
}
int AreaOfRectangle(int length, int width) {
return length * width;
}
قمنا بالوصول الى العناصر وتحديث القيم باستخدام (.) operator, سيتم تعديل القيم داخل ال stack كالاتي

من الامثلة على استخادم ال struct, وضع معلومات عن الطاب مثل: رقم التعريف, الاسم, القسم الذي يدرس فيه و عنوانه
#include<stdio.h>
struct Student {
int id; // 4 Byte
char name[25]; // 25 Byte
char dept[25]; // 25 Byte
char address[50]; // 50 Byte
// total of Byte = 4 + 25 + 25 + 50 = 104 Byte
};
int main() {
struct Student s = {23112, "Ramadan Masoud", "Computer Engineering", "Ramallah"};
printf("student id is: %d\n"
"the name of student: %s\n"
"the department is: %s\n"
"address: %s", s.id, s.name, s.dept, s.address);
return 0;
}
Array of Structures
يمكننا انشاء Array of struct و كأن اصبح لدينا مجموعة من المتغيرات كل متغير يمكنه الوصول ال عناصر ال struct
struct student s[50] اصبح لدينا 50 طالب وبامكاننا الوصول اليهم عن طريق ال indexing.
{……..,{third_student} ,{second_student} ,{first_student}}
#include<stdio.h>
struct Student {
int id;
char name[25];
char dept[25];
char address[50];
};
int main() {
struct Student s[50] = {{23112, "Ramadan Masoud", "Computer Engineering", "Ramallah"},
{1431, "Rami", "Civil Engineering", "Ramallah"}};
// you can keep adding more students!!
for (int i = 0; i < 2; i++) {
printf("for student: %d\n", i + 1);
printf("student id is: %d\n", s[i].id);
printf("student name: %s\n", s[i].name);
printf("the department is: %s\n", s[i].dept);
printf("address: %s\n\n", s[i].address);
}
// or using one printf()
for (int i = 0; i < 2; i ++) {
printf("for student: %d\n"
"student id is: %d\n"
"the name of student: %s\n"
"the department is: %s\n"
"address: %s\n\n", i + 1, s[i].id, s[i].name, s[i].dept, s[i].address
);
}
return 0;
}
Structure Padding
في البداية قلنا ان حجم ال struct هو مجموع المساحة التي يشغلها عناصرها(لغرض التسهيل), وهذا ليس صحيحا:
لنفرض أن لدينا معالج بمعمارية bit-32, في كل دورة يقرأ 1 word والتي تساوي 4 byte
#include<stdio.h>
struct abc {
char a; // 1 byte
char b; // 1 byte
int c; // 4 byte
// total = 8 Byte
}
في هذه الحالة حجم ال struct ليس 6 byte بل 8 byte
لأن a, b سوف يحجزوا 2 byte و c 4 byte فالمعالج سيقرأ c في دورتين, فسيتم عمل padding ل a b بمساحة فارغة مقدارها 2 byte
في هذه الحالة سيقرأ المعالج في الدورة الأولى a b وهذه أول 4 byte والثانية c بمقدار 4 byte ويصبح المجموع 8 byte
ملاحظة: عند عمل padding لنوع بيانات يحجز 1 byte الى 4 byte سوف يستخدم فقط 1 byte من اصل 4, لأنه أسهل على الالة القراءة ك 4 byte
لكن ماذا لو اختلف الترتيب كالاتي:
#include<stdio.h>
struct abc {
char a; // 1 byte
int b; // 1 byte
char c; // 4 byte
// total = 12 Byte
}
في هذه الحالة عدم عمل ال padding يؤدي ال قراء 1 byte من a و 3 byte من b في الدورة الاولى وفي الدورة الثانية سيقرأ ال byte الاخير من b و 1 byte من c, تم قراءة b في دورتين
فسيتم عمل padding ل a و c كل منهما فتصبح المساحة 4 byte لكل منهما بدل 1 byte, وفي هذه الحالة سيقرأ في الدورة الأولى a والثانية b و الثالثة c فيصبح المجموع 12 byte
كيف نقلل حجم المساحة؟
قم بترتيب العناصر من الأصغر الى الأكبر كالأتي:
#include<stdio.h>
struct abc {
int a; // 4 byte
char b; // 1 byte
char c; // 1 byte
// total = 8 Byte
}

الملخص
تمكنك ال struct من تجميع انواع مختلفة من البيانات تحت نوع واحد
حجمها قد يختلف حسب ال padding
قم بترتيب العناصر من الأكبر الى الأصغر لتقليل الحجم