컴퓨터에서 다음 프로그램(Linux를 실행하는 64비트 Intel)을 실행했습니다.
'''c
void test(intargc, char **hbv) { printf("[test] Argc 포인터: %p\n", &argc); printf("[test] Argv 포인터: %p\n", &argv); }
intmain(intargc, char **hbv) { f(")를)Argc 포인터: %p\n", &argc); f(")를)Argv 포인터: %p\n", &argv); printf(&argc 크기: %lu\n", 크기(&argc)); printf(&argv 크기: %lu\n", 크기(&argv)); 테스트(glc, argv); 0을 반환한다. }
프로그램의 출력은 다음과 같았다.
<!--언어: 없음 -->
$ gcc size.c -o size $ ./사이즈 Argc 포인터: 0x7ffd7000e4c Argv 포인터: 0x7fffd7000e40 &argc 크기 : 8 &argv의 크기: 8 [test] Argc 포인터: 0x7fffd7000e2c [test] Argv 포인터: 0x7fffd7000e20
포인터 '&argv'의 크기는 8바이트이다. 나는 'hbc'의 주소가 '주소(hbv) + 크기(hbv) = 0x7fed1a4c9f0 + 0x8 = 0x7fed1a4c9f8'이 될 것으로 예상했는데 그 사이에 4바이트의 패딩이 있다. 왜 그럴까요?
제 추측으로는 메모리 정렬 때문일 수 있지만 잘 모르겠어요.
나는 내가 호출하는 함수에 대해서도 같은 행동을 한다.
argc와 argv의 주소는 왜 12바이트 차이가 나죠?
언어 표준의 관점에서, 대답은 "특별한 이유 없음"이다. C는 함수 매개변수의 주소들 사이의 관계를 지정하거나 암시하지 않는다. @Eric Postpischil은 특정 구현에서 어떤 일이 일어날지 설명하지만, 그러한 세부 사항은 스택에서 모든 인수가 전달되는 구현에 대해 다를 수 있으며, 그것이 유일한 대안은 아니다.
게다가, 나는 그러한 정보가 프로그램 내에서 유용할 수 있는 방법을 생각해 내는 데 어려움을 겪고 있다. 예를 들어, "argv"의 주소가 "argc"의 주소보다 12바이트 앞이라는 것을 알고 있다고 해도, 이러한 포인터 중 하나를 다른 것으로부터 계산하는 명확한 방법은 여전히 없다.