সি প্রোগ্রামিং-এ ভেরিয়েবলগুলো মেমরিতে কীভাবে সংরক্ষিত থাকে তা বুঝতে তাদের মেমরি রিপ্রেজেন্টেশন দেখতে পারি। এখানে আমরা ইন্টিজার, ফ্লোট এবং পয়েন্টারের মেমরি কন্টেন্ট দেখাব।
পদ্ধতি
- ভেরিয়েবলের ঠিকানা এবং আকার নিন
- ঠিকানাটিকে ক্যারেক্টার পয়েন্টারে কাস্ট করুন বাইট লেভেল এক্সেস পাওয়ার জন্য
- ভেরিয়েবলের আকার পর্যন্ত লুপ চালিয়ে প্রতিটি বাইটের মান প্রিন্ট করুন
উদাহরণ
#include <stdio.h>
typedef unsigned char *byte_pointer;
void disp_bytes(byte_pointer ptr, int len) {
int i;
for (i = 0; i < len; i++)
printf(" %.2x", ptr[i]);
printf("\n");
}
void disp_int(int x) {
disp_bytes((byte_pointer) &x, sizeof(int));
}
void disp_float(float x) {
disp_bytes((byte_pointer) &x, sizeof(float));
}
void disp_pointer(void *x) {
disp_bytes((byte_pointer) &x, sizeof(void *));
}
int main() {
int i = 5;
float f = 2.0;
int *p = &i;
disp_int(i);
disp_float(f);
disp_pointer(p);
disp_int(i);
return 0;
}
আউটপুট
05 00 00 00 00 00 00 40 3c fe 22 00 00 00 00 00 05 00 00 00
ব্যাখ্যা
- ইন্টিজার ৫: লিটল-এন্ডিয়ান ফরম্যাটে
05 00 00 00(৪ বাইট) - ফ্লোট ২.০: IEEE 754 ফরম্যাটে
00 00 00 40(৪ বাইট) - পয়েন্টার: সিস্টেমের আর্কিটেকচার অনুযায়ী ৮ বাইট (৬৪-বিট সিস্টেমে)
- পুনরায়
disp_int(i)কল করলে একই আউটপুট আসে
দ্রষ্টব্য: আউটপুট সিস্টেমের এন্ডিয়ানেস এবং আর্কিটেকচার (৩২-বিট বা ৬৪-বিট) এর উপর নির্ভর করে পরিবর্তিত হতে পারে।