আমি আমার কম্পিউটারে নিম্নলিখিত প্রোগ্রামটি চালিয়েছি (-৪-বিট ইন্টেল চলমান লিনাক্স)।
#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
পয়েন্টারের আকার &argv8 বাইট। আমি এর ঠিকানা প্রত্যাশিত argcহতে address of (argv) + sizeof (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8কিন্তু তাদের মধ্যে একটি 4 বাইট প্যাডিং হয়। কেন এই ক্ষেত্রে?
আমার ধারণা এটি মেমোরি অ্যালাইনমেন্টের কারণে হতে পারে তবে আমি নিশ্চিত নই।
আমি যে ফাংশনগুলি কল করি তার সাথে একই আচরণ লক্ষ্য করি।
main। সি তে, mainনিয়মিত ফাংশন হিসাবে ডাকা যেতে পারে, তাই এটি নিয়মিত ফাংশনের মতো আর্গুমেন্ট গ্রহণ করা প্রয়োজন এবং অবশ্যই এবিআইয়ের আনুগত্য করতে হবে।
%zu
main।