2014-11-06 2 views
2

C에서 버디 할당 알고리즘을 구현하는 프로젝트에서 작업 중입니다. mmap()을 사용하여 1GB의 연속 메모리 공간을 할당했습니다. 다음과 같이 보입니다 :어떻게 동적으로 할당 된 공간에이 구조체를 넣을 수 있습니까?

char * base = mmap(NULL, MAX_MEM, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, 0, 0); 

나는 그 공간에 넣으려고하는 구조체를 가지고 있습니다. 구조체는 다음과 같습니다.

typedef struct Node { 
    unsigned char header; 
    struct Node *next; 
    struct Node *prev; 

}node; 

노드를 그 지점으로 가져 오는 방법을 잘 모르겠습니다. 나는 맨 처음에 노드를하지 않았기 때문에 아래의 코드를했지만, 내가 포인터를 인쇄 할 때 그들은 많은 다른 점을 보여이 밖으로

void *ptr = (struct Node *) base + 512; 
printf("base: %p\n", base); 
printf("ptr: %p\n", ptr); 

내 터미널 창 인쇄 :

base: 0x102ef1000 
ptr: 0x102ef4000 

하지만 포인터가 12288 개의 공백으로 512 개가 아닌 서로 다른 메모리에 있기 때문에 이것은 올바르게 보이지 않습니다. 무엇이 잘못 되었나요?

+0

다음 줄 : void * ptr = ((struct Node *) base) + 512; 다음과 같아야합니다. node * ptr = (node ​​*) ((char *) (base + 512)); humm,이 편집기는 (노드 *)에 '*'를 계속 표시합니다. – user3629249

답변

1
void *ptr = (struct Node *) base + 512; 

수단 ((구조체 노드 *)베이스) + 당신이 원하는 무엇 512

void *ptr = (struct Node *) (base + 512); 

그래서 당신이 할당의 시작 부분에서 512 바이트를 건너 뛸 수 있습니다.

the post에 따르면, 캐스트는 추가보다 우선 순위가 높습니다.

+0

감사합니다! 당신이 괜찮 으면 한 가지 더 질문하십시오. 내 구조체에 "char header"라는 속성이 있습니다. 이제 구조체가 동적으로 할당 된 공간에 있는데 어떻게 헤더 부분에 액세스합니까? 포인터이기 때문에 ptr.header를 사용할 수 없습니다. – GoFlyers

+0

'ptr'을'struct Node'에'((struct Node *) ptr) -> 헤더로 던지거나'ptr'을'struct Node *'타입으로 바꾸고 ptr-> 헤더를 할 수 있습니다. – SSC

1

기지에 struct Node *을 추가하면 포인터에 struct Node의 크기가 추가되므로 기억에 sizeof(struct Node) * 512이 추가됩니다. 이것은 아마도 당신이 원하는 것이 아닙니다. 주어진 24 바이트 구조체이므로 24 * 512 = 12288이됩니다.

12 바이트 인 이유는 포인터가 8 바이트로 정렬되도록 2 개의 8 바이트 포인터, 1 바이트의 char 및 7 바이트의 패딩을 포함하기 때문입니다.

단순히 캐스팅을 생략하면 char *으로 기본이되며 원하는대로 512 바이트 증가합니다.

void *ptr = base + 512; 
관련 문제