2013-05-02 3 views
0

이 주제가 이미 논의 된 경우 미안해, StackOverflow에서 새로운 기능입니다.C에서 구조 노드에 액세스

나는 프로젝트에서 일하고 있는데, 나는 최소한의 메모리를 사용해야한다. 나의 질문은 다음과 같다 :이 구조체 필드의 주소를 가지고 구조의 노드 주소에 접근 할 수 있는가? . 예를 들어 나는이 구조를 가지고 :

어딘가에 내 코드에서
typedef struct SLL{ 
    char *name; 
    int *id; 
    struct SLL *next; 
    }SLL; 

내가 ID의 ADRESS을 얻을 ... 그래서 아이디의 ADRESS를 사용하여 전체 노드의 ADRESS을 얻을 수 있습니다?

답변

0

offsetof <stddef.h>을 고려

typedef struct SLL{ 
    char *name; 
    int *id; 
    struct SLL *next; 
    }SLL; 

int main() 
{ 
    SLL *p=malloc(sizeof(SLL)); 
    void *id=&p->id; 
    void *test= id - offsetof(SLL, id); 
    printf("SLL=%p test=%p\n", p, test); 
    return 0; 

}  
+0

Thx! 사용하지 않기 때문에 이제는 두 가지 기능을 제외 할 수 있습니다. – line2sun

0

구조가 연속적으로 저장되어 있기 때문에 가능합니다. 귀하의 질문은 포인터 연산에 해당합니다. 전체 노드의 주소 (구조 포인터의 값)는 (SLL *) (id - sizeof (name))입니다.

0

일반적으로 구조체의 주소는 첫 번째 멤버의 주소와 같습니다.

이 코드는 컴파일러에 따라 다르지만 (생각하면입니다.) 진심으로 말씀해주십시오.) 이해가 안되는 이유 때문에 구조체에 패딩 바이트가 추가 될 수 있지만 if 경험이 많은 사람은 이유를 설명이에 대해 언급하는 것입니다 : V

가장 좋은 방법은 (INT의 * 아이디)의 메모리 주소를 sizeof (숯불 *)를 뺀된다.

0

가 YES 당신이 그것을 얻을 수 있습니다. 즉시이 구조에 메모리를 제공하므로 여기, 이거 블록에 대한 예약을 얻을 것이다 메모리 블록은 다음 두 번째 요소에 대한 포인터를 알고있다 type.if CHAR, INT 및 SLL 세 가지 포인터에 대한 연속적인 메모리 lcation이있을 것이다 이 구조체의 기본 위치 (또는 첫 번째 요소)에 도달하기 위해 sizeof (char *)를 빼기 만하면됩니다.