지금까지 포인터와 구조체에 대해 조금 다루었지만 런타임에 구조체 배열을 할당하는 방법을 잘 모르겠습니다. 아래를 참조하십시오.
NB "user_size"는 런타임에 초기화됩니다.
typedef struct _COORDS
{
double x;
double y;
double area;
double circumference;
int index;
wchar_t name[16];
} COORDS, *PCOORDS;
PCOORDS pCoords = (PCOORDS)malloc(sizeof(COORDS)* user_size);
// NULL ptr check omitted
그 후, 난 그냥 액세스 할 수 있습니다 pCoords[0]
에 pCoords[user_size-1]
의 int의 일반 배열처럼?
요점 : 컴파일러가 할당 된 메모리에 구조의 레이아웃을 중첩하는 방법을 이해하지 못합니까? 그렇게해야하나요 아니면 너무 많이 생각하고 있나요?
컴파일러는 구조를 메모리에 중첩하지 않습니다.
구조의 배열은 한 요소의 인덱스에 전체 크기를 곱하여 액세스합니다. pCoords[3]
예를 들어 pCoords + 3*sizeof(COORDS)
는 메모리 에서 "at" 입니다.
구조체 멤버는 오프셋 (패딩을 고려하여 이전 요소의 크기로 계산 됨)에 의해 액세스됩니다 . 따라서 멤버 x
는 0
컨테이너의 시작에서 오프셋 에 배열 요소 인덱스를 pCoords
더한 값에 있습니다 sizeof(COORDS)
. 하고 y
있다 sizeof(x)
그 후.
당신이 때문에 말할 A의 크기 (1) 당신이 메모리의 연속 블록을 원하는 컴파일러 user_size
회 하나의 크기 COORD
, (2) 다음이를 통해 액세스 pCoords[2].y
가 수행하는 모든 곱셈, 그리고 추가 한 다음 읽기 해당 메모리 주소의 값 (문자 그대로). 의 유형이 y
이므로 double
원시 바이트 를 double 로 읽고 해석합니다 . 그리고 일반적으로 그것이 옳습니다.
발생할 수있는 유일한 문제는 동일한 메모리 영역에 대한 포인터 가 여러 개있을 때 입니다. 즉, 주소 "에있는"원시 바이트는 다른 유형으로 해석해야 할 수 있습니다 (예를 들어, 하나의 포인터가 an int
및 다른 a 를 기대하도록 지시 할 때 double
).
유효한 범위가 acutally 0
.. user_size - 1
라는 조건으로 코드는 괜찮습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다