স্ট্রাকচার(Structure) এবং ইউনিয়ন(Union) দুইটাই সি প্রোগ্রামিং ল্যাংগুয়েজের ইউজার ডিফাইন্ড(User Defined) ডাটা টাইপ। ইউজার ডিফাইন্ড ডাটা টাইপ হচ্ছে এমন একটা ডাটা টাইপ যেটার টাইপ কি হবে সেটা ইউজার অর্থাৎ প্রোগ্রামার ঠিক করে দেবে। অনেক সময় আমাদের এমন কিছু জটিল প্রোগ্রাম করার প্রয়োজন হতে পারে যখন বেসিক ডাটা টাইপ ব্যবহার করা কষ্টসাধ্য। এসব ক্ষেত্রে আমরা এই স্ট্রাকচার এবং ইউনিয়ন ব্যবহার করে কাজগুলোকে অনেক সহজ করে নিতে পারি। এখন আমরা এই দুইটা ডাটা টাইপের গঠন ও ব্যবহার সম্পর্কে জানব –

স্ট্রাকচার(Structure)

স্ট্রাকচার ডিফাইন করতে struct কিওয়ার্ড(Keyword) টি ব্যবহার করতে হয়। তারপর স্ট্রাকচারের নাম অর্থাৎ আমাদের কাঙ্খিত ভেরিয়েবলের নাম। এখন আমরা একটি স্ট্রাকচার তৈরি করব এবং এর বিভিন্ন অংশ সম্পর্কে জানব –

/*
Author: Shahinur
Description: This program is to demonstrate the structure in C
*/

#include <stdio.h>
#include <string.h>

struct Student{
    unsigned long int roll;
    char name[20];
    char dept[10];
};

int main() {
	struct Student s1,s2;
	
	s1.roll=100120;
	strcpy(s1.name,"Shahinur");
	strcpy(s1.dept,"CSE");
	
	printf("Roll:%d\nName:%s\nDepartment:%s\n",s1.roll,s1.name,s1.dept);
	
	printf("The memory size is: %d",sizeof(s1));
	
	return 0;
}

৯ নম্বর লাইনে আমরা একটা স্ট্রাকচার ডিক্লেয়ার করেছি। struct কিওয়ার্ড এর পরে আমরা একটা নাম দিয়েছি Student, এর এটাই আমাদের ডিফাইন করা ভেরিয়েবলের নাম। তারপর আমরা আমাদের প্রয়োজনমত মৌলিক ডাটা টাইপ দিয়ে সাজিয়েছি। ব্রাকেটের শেষে একটা সেমিকোলন দিয়ে স্ট্রাকচারটি শেষ হয়েছে।

১৬ নম্বর লাইনে আমরা Student নামের স্ট্রাকচার টাইপের একটা ভেরিয়েবল s1 এবং s2 ডিক্লেয়ার করেছি। সংক্ষিপ্ত কোডের জন্য আমরা এখানে শুধু s1 ভেরিয়েবল টাই ব্যবহার করেছি।

স্ট্রাকচারের কোন নির্দিষ্ট এলিমেন্ট কে এক্সেস করতে হলে ডট(.) অপারেটর ব্যবহার করতে হয়। ১৮ নম্বর লাইনে আমরা s1.roll দিয়ে আমরা s1 এর roll এলিমেন্টটাকে এক্সেস করেছি এবং সেখানে একটা ভ্যালু এসাইন করেছি একেবারে সাধারন ভেরিয়েবলে এসাইন করার মত। বাকিগুলোও একই রকম। এখানে মনে রাখা দরকার, আমরা কিন্তু s1 ভেরিয়েবলের এলিমেন্টগুলো ব্যবহার করেছি। এর প্রভাব s2 তে পড়বেনা। s2 কে ব্যবহার করতে গেলেও একইভাবে ডট অপারেটর দিয়ে এক্সেস করেতে হবে।

আমার এখানে উপরের কোডটির আউটপুট নিম্নরুপঃ

Roll:100120

Name:Shahinur

Department:CSE

The memory size is: 40

এখানে লক্ষ্যনীয় যে আমাদের s1 ভেরিয়েবলটি মেমরিতে ৪০ বাইট জায়গা নিয়েছে। একটু হিসাব করি।

আমরা জানি, সাধারণ int মেমরিতে ২ বাইট জায়গা রাখে। কিন্তু আমরা এখানে unsigned long int ব্যবহার করেছি, আর এই unsigned long int মেমরিতে ৮ বাইট জায়গা দখল করে। অন্যদিকে আমরা জানি char টাইপ, মেমরিতে ১ বাইট জায়গা দখল করে। সেই হিসাবে মেমরি সাইজ = ৮+২০+১০ = ৩৮ বাইট। মনে হয়তো খটকা লেগে গেল যে আমাদের প্রোগ্রামে তো মেমরি সাইজ ৪০ দেখাচ্ছে তাহলে হিসাবে ৩৮ কেন আসল? এর কারণ হচ্ছে বাকি ২ বাইট প্যাডিং এর জন্য ব্যবহৃত হয়েছে।

ইউনিয়ন(Union)

ইউনিয়ন এবং স্ট্রাকচার একই ধরনের কাজ করে। শুধুমাত্র মেমরি হিসাবটা আলাদা। স্ট্রাকচারের মেমরি সাইজ হয় যে বেসিক ডাটাটাইপগুলো ব্যবহার করা হয়েছে সেই মেমরির যোগফলের সমস্টি বা তার থেকে বেশি। কিন্তু ইউনিয়নের ক্ষেত্রে একটু ভিন্ন। ইউনিয়নের মেমরি সাইজ হয় ঐ ইউনিয়নে ব্যবহৃত সবচেয়ে বড় ডাটা টাইপের সাইজের সমান বা বড়। উপরের কোডটা যদি আমরা ইউনিয়নের কোড দিয়ে রিপ্লেস করি তাহলে হবে –

/*
Author: Shahinur
Description: This program is to demonstrate the union in C
*/

#include <stdio.h>
#include <string.h>

union Student{
    unsigned long int roll;
    char name[20];
    char dept[10];
};

int main() {
	union Student s1,s2;
	
	s1.roll=100120;
	strcpy(s1.name,"Shahinur");
	strcpy(s1.dept,"CSE");
	
	printf("Roll:%d\nName:%s\nDepartment:%s\n",s1.roll,s1.name,s1.dept);
	
	printf("The memory size is: %d",sizeof(s1));
	
	return 0;
}

লক্ষ্য করবেন এখানে শুধু struct কে union দিয়ে রিপ্লেস করা হয়েছে। আমার এখানে মেমরি সাইজ এসেছে ২৪। অর্থাৎ সর্বোচ্চ সাইজ name এর সাথে প্যাডিং যোগ করে ২৪ হয়েছে।

আশাকরি বুঝতে পেরেছেন সবাই। তবুও যদি কোথাও কোন সমস্যা থাকে তাহলে অবশ্যই মন্তব্য করবেন।
ধন্যবাদ।