স্ট্যাটিক ভেরিয়েবল হলো এমন ভেরিয়েবল যা প্রোগ্রাম চলাকালিন মেমরিতে থাকে, অর্থাৎ এর লাইফটাইম হলো পুরো প্রোগ্রাম রান। এটি অটোমেটিক ভেরিয়েবলের থেকে আলাদা কারণ অটোমেটিক ভেরিয়েবল শুধুমাত্র তাদের ফাংশন চলাকালিন মেমরিতে থাকে এবং ফাংশন শেষ হলে নষ্ট হয়।
স্ট্যাটিক ভেরিয়েবলগুলো মেমরির ডেটা সেগমেন্ট-এ সংরক্ষিত হয়। ডেটা সেগমেন্ট হলো একটি প্রোগ্রামের ভার্চুয়াল অ্যাড্রেস স্পেসের একটি অংশ।
যে সকল স্ট্যাটিক ভেরিয়েবলে এক্সপ্লিসিট ইনিশিয়ালাইজেশন নেই বা যেগুলো শূন্যে ইনিশিয়ালাইজড সেগুলো আনইনিশিয়ালাইজড ডেটা সেগমেন্ট-এ (যাকে BSS সেগমেন্টও বলা হয়) সংরক্ষিত হয়। এর বিপরীতে, ইনিশিয়ালাইজড স্ট্যাটিক ভেরিয়েবলগুলো ইনিশিয়ালাইজড ডেটা সেগমেন্ট-এ সংরক্ষিত হয়।
উদাহরণ:
static int x = 5; static int y; স্ট্যাটিক ভেরিয়েবল x ইনিশিয়ালাইজড ডেটা সেগমেন্টে এবং y BSS সেগমেন্টে সংরক্ষিত হবে।
সি-এ স্ট্যাটিক ভেরিয়েবল প্রদর্শনের একটি প্রোগ্রাম:
উদাহরণ
#include<stdio.h>
int func(){
static int i = 4;
i++;
return i;
}
int main(){
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
return 0;
}
উপরের প্রোগ্রামের আউটপুট:
5 6 7 8 9 10
এখন প্রোগ্রামটি বুঝে নিই।
func() ফাংশনে i একটি স্ট্যাটিক ভেরিয়েবল যা ৪ দিয়ে ইনিশিয়ালাইজড। তাই এটি ইনিশিয়ালাইজড ডেটা সেগমেন্টে সংরক্ষিত। তারপর i ইনক্রিমেন্ট হয়ে এর মান রিটার্ন করা হয়। কোড স্নিপেট:
int func(){
static int i = 4;
i++;
return i;
}
main() ফাংশনে func() ৬ বার কল করা হয়েছে এবং প্রতিবার i-র মান প্রিন্ট করা হয়েছে। যেহেতু i স্ট্যাটিক, তাই প্রোগ্রাম চলাকালিন মেমরিতে থাকে এবং ধারাবাহিক মান প্রদান করে। কোড স্নিপেট:
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());