আমি আমার কম্পিউটারে নিম্নলিখিত প্রোগ্রামটি চালিয়েছি (-৪-বিট ইন্টেল চলমান লিনাক্স)।
#include <stdio.h>
void test(int argc, char **argv) {
printf("[test] Argc Pointer: %p\n", &argc);
printf("[test] Argv Pointer: %p\n", &argv);
}
int main(int argc, char **argv) {
printf("Argc Pointer: %p\n", &argc);
printf("Argv Pointer: %p\n", &argv);
printf("Size of &argc: %lu\n", sizeof (&argc));
printf("Size of &argv: %lu\n", sizeof (&argv));
test(argc, argv);
return 0;
}
প্রোগ্রামের আউটপুট ছিল
$ gcc size.c -o size
$ ./size
Argc Pointer: 0x7fffd7000e4c
Argv Pointer: 0x7fffd7000e40
Size of &argc: 8
Size of &argv: 8
[test] Argc Pointer: 0x7fffd7000e2c
[test] Argv Pointer: 0x7fffd7000e20
পয়েন্টারের আকার &argv
8 বাইট। আমি এর ঠিকানা প্রত্যাশিত argc
হতে address of (argv) + sizeof (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8
কিন্তু তাদের মধ্যে একটি 4 বাইট প্যাডিং হয়। কেন এই ক্ষেত্রে?
আমার ধারণা এটি মেমোরি অ্যালাইনমেন্টের কারণে হতে পারে তবে আমি নিশ্চিত নই।
আমি যে ফাংশনগুলি কল করি তার সাথে একই আচরণ লক্ষ্য করি।
main
। সি তে, main
নিয়মিত ফাংশন হিসাবে ডাকা যেতে পারে, তাই এটি নিয়মিত ফাংশনের মতো আর্গুমেন্ট গ্রহণ করা প্রয়োজন এবং অবশ্যই এবিআইয়ের আনুগত্য করতে হবে।
%zu
main
।