मैंने अपने कंप्यूटर पर निम्न प्रोग्राम चलाया (64-बिट इंटेल पर चलने वाला लिनक्स)।
#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
एक नियमित फ़ंक्शन के रूप में कहा जा सकता है, इसलिए इसे एक नियमित फ़ंक्शन की तरह तर्क प्राप्त करना होगा और एबीआई का पालन करना होगा।
main
।