2013-01-31 2 views
1

내가 구조체구조체의 멤버에 액세스하기위한 인덱싱. C 프로그래밍

typedef struct 
{ 
    unsigned char mem1; 
    unsigned char *mem2 
} MEMBERS; 

를 가정 어디

내가 함수 "GET_MEM가"에 구조 "MEMBERS"의 주소를 반환 MEM1와 MEM2, 두 값에 접근 할 필요가
unsigned sample = 12 
MEMBERS memvalues = { 0x15 , &sample }; 

X_mem.

unsigned char *X_mem = GET_MEM (); //function returns address of memvalues 
unsigned value1 = *X-mem; 
unsigned Value2 = *++X_mem; 

내가 값 1은 0x15주고 싶어하고, 값 2 내가이 일을 할 수있는 방법 (12)

을 제공합니다 : 내 말은 이것이다?

참고 : 위의 코드 예제가 구문 상 올바르다 고 가정하지 마십시오. 저의 의도를 표현하기위한 것입니다. 감사합니다.

const MEMBERS *some_members = (MEMBERS *) GET_MEM(); 
unsigned value1 = some_members->mem1; 
unsigned value2 = *some_members->mem2; 
+1

'unsigned char * X_mem = GET_MEM(); // 함수가 memvalues의 디자인을 잘못 반환하면'MEMBERS * '가 반환됩니다. –

+0

당신은 어떻게 의미합니까? –

+0

'GET_MEM()'은'MEMBERS *'를 반환해야합니다. 왜냐하면 실제로 리턴하는 것이기 때문에'MEMBERS * '에 반환 값을 저장해야합니다. –

답변

1

당신은 GET_MEM()에 의해 반환 된 잘못 입력 포인터를 캐스팅해야합니다.

MEMBERS *X_mem = GET_MEM(); //function returns address of memvalues 
unsigned char value1 = X_men->mem1; 
unsigned char Value2 = *(X_mem->mem2); 
1

그래가, GET_MEM이() 구조체의 주소를 반환 :

1

X_mem이 MEMBERS 구조체에 대한 포인터로 선언되지 않으면이 기능을 사용할 수 없습니다. 컴파일러는 구조체에 mem1 이후의 임의의 수의 패딩 바이트를 자유롭게 추가 할 수 있기 때문에 구조체 시작 부분의 주소 오프셋에 의존하려면 위험하고 이식성이 없습니다. 따라서 제 솔직한 해결책은 MEMBERS *X_mem을 작성한 다음 -> 연산자를 통해 각 구성원에 액세스하는 것입니다.

이와 같은 오프셋에 의존하는 코드를 작성해야하는 경우 "패딩 바이트 패턴"이 예상 한대로 또는 패딩이 완전히 해제되어 있는지 확인해야합니다.

관련 문제