[해결]구조체 Alignment때문에 36인건 알겠습니다. 그런데 왜 40씩 증가합니까? ---C언어

저는 linux에서 학습하고 있습니다.(GCC사용중…)

typedef struct str
{
char x[10];
char y[20];
int z;
} Str;

Str * arr[3];
Str ** ptr = arr;


arr[0] = (Str *)malloc(sizeof(Str));

arr[0]: 0xbfb23694, ptr+0: 0xbfb23694
arr[1]: 0xbfb23698, ptr+1: 0xbfb23698

arr[0]->x: 0x9aa6008, (*((ptr)+0)).x: 0x9aa6008
arr[1]->x: 0x9aa6030, (
((ptr)+1)).x: 0x9aa602c
arr[2]->x: 0x9aa6058, (
((*ptr)+1)).x: 0x9aa6050

" sizeof(Str) "의 결과는 36입니다. ptr의 경우 예상한대로 주소값이 증가합니다.(36씩 증가합니다.)

질문은 arr의 경우 40씩 증가합니다. 똑같은 자료형에 분명히 시작주소도 같습니다. 그런데 한쪽은 40씩 다른 한 쪽은 36씩 증가해 다른 결과를 가져옵니다. 어떻게 40씩 증가하게 된 것인가요?

덧붙여 " (*((*ptr)+0)).x "를 " ptr[0]->x "로 바꾸고 확인해보면, arr과 똑같은 결과를 보여줍니다.

[quote="moozan":t0der5da]

arr[0] = (Str *)malloc(sizeof(Str));

arr[0]: 0xbfb23694, ptr+0: 0xbfb23694
arr[1]: 0xbfb23698, ptr+1: 0xbfb23698

arr[0]->x: 0x9aa6008, (*((ptr)+0)).x: 0x9aa6008
arr[1]->x: 0x9aa6030, (
((ptr)+1)).x: 0x9aa602c
arr[2]->x: 0x9aa6058, (
((*ptr)+1)).x: 0x9aa6050

[/quote:t0der5da]
지금 Str 구조체가 배열로 할당된 것이 아닙니다!

malloc으로 동적 할당했기 때문에 구조체의 시작 위치는 (Heap 내에서) 어느 곳이든 상관 없습니다. 따라서 arr[0] 구조체 다음에 arr[1] 구조체가 반드시 36바이트 뒤에 오지는 않습니다.
저의 경우 64비트 컴파일러를 쓰기 때문에, 왼쪽의 값이 40바이트가 아닌 44 바이트씩 증가합니다.

그리고 (*((ptr)+0)).x 는 단순한 Pointer 연산일 뿐입니다. (((*ptr)+1)).x 의 경우에, (ptr)+1을 하면 Str 크기(36바이트)만큼 주소를 증가시키고, 여기에 (((*ptr)+0)).x 를 해서 x를 참조하면 C에서는 (((ptr)+1)+0) 을 수행해줍니다.
즉, 배열처럼 구조체 참조도 단순한 포인터 연산으로 변경되기 때문에 (
((ptr)+0)).x의 경우에는 36바이트 증가하는 것이 맞습니다.
( (
((*ptr)+0)).y 의 경우 (((*ptr)+1)+10) 을 수행하게 됩니다. )

답변 감사합니다.