programing

argc와 argv의 주소가 12바이트 차이가 나는 이유는 무엇입니까?

bestprogram 2023. 8. 20. 12:18

argc와 argv의 주소가 12바이트 차이가 나는 이유는 무엇입니까?

컴퓨터에서 다음 프로그램을 실행했습니다(Linux를 실행하는 64비트 Intel).

#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바이트의 패딩이 있습니다.왜 그럴까요?

메모리 정렬 때문인 것 같은데 잘 모르겠어요.

저는 제가 호출하는 기능에도 같은 행동을 보입니다.

시스템에서 처음 몇 개의 정수 또는 포인터 인수는 레지스터에 전달되며 주소가 없습니다.당신이 그들의 주소를 가지고 있을 때.&argc또는&argv컴파일러는 레지스터 내용을 스택 위치에 쓰고 해당 스택 위치의 주소를 제공하여 주소를 조작해야 합니다.그렇게 함으로써 컴파일러는 어떤 의미에서 편리한 스택 위치를 선택합니다.

argc와 argv의 주소가 12바이트 차이가 나는 이유는 무엇입니까?

언어 표준의 관점에서, 대답은 "특별한 이유는 없습니다"입니다.C는 함수 모수의 주소 간의 관계를 지정하거나 암시하지 않습니다.@Eric Postischil은 특정 구현에서 발생할 수 있는 상황을 설명하지만, 스택에서 모든 인수가 전달되는 구현의 경우 이러한 세부 정보가 다를 수 있으며, 이는 유일한 대안이 아닙니다.

게다가, 저는 그러한 정보가 프로그램 내에서 유용할 수 있는 방법을 찾는 데 어려움을 겪고 있습니다.예를 들어, 당신이 주소를 "알고" 있다 하더라도.argv의 주소보다 12바이트 앞에 있습니다.argc다른 포인터의 포인터를 계산할 수 있는 정의된 방법은 아직 없습니다.

언급URL : https://stackoverflow.com/questions/60128314/why-are-the-addresses-of-argc-and-argv-12-bytes-apart