সি/সি++-এ ফাংশনগুলোক মেমরিতে কোড সেগমেন্টে (Text Segment) সংরক্ষিত থাকে, তাই ভেরিয়েবলের মতোই তাদেরও মেমরি অ্যাড্রেস রয়েছে। ফাংশন নাম ব্যবহার করে (প্যারেনথেসিস ছাড়া) এর অ্যাড্রেস পাওয়া যায়।
উদাহরণ
#include <stdio.h>
void my_function() {
printf("Hello World\n");
}
int main() {
printf("The address of my_function is: %p\n", (void*)my_function);
printf("The address of main is: %p\n", (void*)main);
return 0;
}
আউটপুট (নমুনা)
The address of my_function is: 0000000000401530
The address of main is: 000000000040154B
ব্যাখ্যা
my_function(প্যারেনথেসিস ছাড়া) → ফাংশনের এন্ট্রি পয়েন্টের অ্যাড্রেস&my_function— একই অর্থে কাজ করে (সি-এ অপশনাল, সি++-এ প্রিয়)%pফরম্যাট স্পেসিফায়ার দিয়ে প্রিন্ট করুন এবং(void*)কাস্ট করুন
ফাংশন পয়েন্টার হিসেবে ব্যবহার
void (*func_ptr)() = my_function; // অ্যাসাইন
func_ptr(); // কল (সমতুল্য my_function())
ব্যবহার ক্ষেত্র
- কলব্যাক (Callback) ফাংশন
- ফাংশন টেবিল / জাম্প টেবিল (State machine, VM, ইন্টারপ্রেটার)
- প্লাগইন সিস্টেম, ডাইনামিক লোডিং (
dlsym) - সিগন্যাল হ্যান্ডলার রেজিস্ট্রেশন (
signal(),sigaction())
দ্রষ্টব্য
- ফাংশন পয়েন্টারের টাইপ সাইনেচার মিলতে হবে (রিটার্ন টাইপ, প্যারামিটার লিস্ট)
- সি++-এ মেম্বার ফাংশন পয়েন্টার আলাদা টাইপ (
void (Class::*)()) এবং ভিন্ন সিনট্যাক্স - ASLR (Address Space Layout Randomization) সক্রিয় থাকলে প্রতিটি রানে অ্যাড্রেস ভিন্ন হবে