ড্যাংলিং পয়েন্টার
ড্যাংলিং পয়েন্টার হলো এমন পয়েন্টার যা ইতিমধ্যে ফ্রি বা ডিলিট করা মেমরি লোকেশনকে পয়েন্ট করে। পয়েন্টার ড্যাংলিং হতে পারে নিম্নোক্ত উপায়ে:
ফাংশন কল
লোকাল ভেরিয়েবলে পয়েন্ট করার পয়েন্টার ড্যাংলিং হয়ে যায় যদি লোকাল ভেরিয়েবল static না হয়।
int* show(void) {
int n = 76;
return &n;
}আউটপুট
গারবেজ ঠিকানা আউটপুট হবে।
মেমরি ডি-অ্যালোকেশন
#include <stdlib.h>
#include <stdio.h>
int main() {
float* p = (float*)malloc(sizeof(float));
free(p); // free() কল করার পর p ড্যাংলিং পয়েন্টার
p = NULL; // এখন p ড্যাংলিং নয়
}ভেরিয়েবল স্কোপ থেকে বাইরে যাওয়া
int main() {
int* p;
{
int c;
p = &c;
}
// এখানে p ড্যাংলিং পয়েন্টার
}ভয়েড পয়েন্টার
C-এ ভয়েড পয়েন্টার যেকোনো ডেটা টাইপের সাথে জড়িত নয়। এটি স্টোরেজে ডেটা লোকেশনের ঠিকানা নির্দেশ করে। এটাকে জেনারেল পারপাস পয়েন্টারও বলা হয়।
সীমাবদ্ধতা:
- কনক্রিট সাইজ না থাকায় পয়েন্টার আритমেটিক সম্ভব নয়।
- এটি ডিরেফারেন্স করা যায় না।
সহজ উদাহরণ
#include <stdlib.h>
int main() {
int a = 7;
float b = 7.6;
void* p;
p = &a;
printf("Integer variable is = %d", *((int*)p));
p = &b;
printf("\nFloat variable is = %f", *((float*)p));
return 0;
}আউটপুট
Integer variable is = 7 Float variable is = 7.600000
অ্যালগরিদম
Begin
ইন্টিজার a এবং ফ্লোট b ইনিশিয়ালাইজ করুন।
ভয়েড পয়েন্টার p ঘোষণা করুন।
(int*)p = ভয়েডের টাইপ কাস্টিং।
p = &b মানে p এখন ফ্লোট।
(float*)p = ভয়েডের টাইপ কাস্টিং।
মান প্রিন্ট করুন।
End.নাল পয়েন্টার
নাল পয়েন্টার কোনো কিছুই পয়েন্ট করে না। ব্যবহার:
- পয়েন্টার ভেরিয়েবল ইনিশিয়ালাইজ করার সময়যখন এখনো কোনো বৈধ ঠিকানা নেই।
- ফাংশন আর্গুমেন্টে নাল পয়েন্টার পাস করুন যখন কোনো বৈধ ঠিকানা পাস করতে চান না।
- পয়েন্টার অ্যাক্সেস করার আগে নাল চেক করুন তাতে ডিরেফারেন্স করার সময় এরর হ্যান্ডলিং করা যায়।
উদাহরণ
#include <iostream>
#include <stdio.h>
int main() {
int* p = NULL;
printf("The value of pointer is %u", p);
return 0;
}আউটপুট
The value of pointer is 0.
ওয়াইল্ড পয়েন্টার
ওয়াইল্ড পয়েন্টার যেকোনো আর্বিট্রারি মেমরি লোকেশনে পয়েন্ট করে (নালও নয়)।
int main() {
int* ptr; // ওয়াইল্ড পয়েন্টার
*ptr = 5; // অনির্দিষ্ট আচরণ
}