2012-02-23 2 views
1

mmap의 크기 매개 변수를 이해하는 데 어려움을 겪고 있습니다 (미안하지만 C가 녹슬지 않습니다). 예를 들어 우리가있는 경우mmap 크기 매개 변수 이해

(다른 SO 게시물에서 촬영) :

typedef struct container { 
    int counter; 
} container; 

container *memory; 
memory = mmap(NULL, 500*sizeof(container), PROT_READ|PROT_WRITE, MAP_SHARED, -1, 0); 

container *entry = (container *) malloc(sizeof(container)); 
entry->counter = 1; 
// Just arbitrarily 
memory[1] = *entry; 

메모리 [1] 단순히 컨테이너에 포인터되지 않습니다 따라서는 sizeof (용기)하지? 아니면 mmap을 사용하여 컨테이너의 500 개 항목 만 삽입 할 수 있는지 확인하는 방법이 있습니까? 또는 sizeof (컨테이너) 단위로 메모리에 액세스해야합니까?

감사합니다.

+0

메모리는 컨테이너에 대한 포인터이므로 메모리 [1]은 컨테이너입니다. * (메모리 + 1)과 같습니다. –

답변

2

우선 메모리를 얻기 위해 mmap을 사용하는 동안 질문에 아무것도 mmap에만 해당됩니다. 그냥 일을 한 경우 동일한 결론이 적용됩니다 :

container *memory = malloc(500*sizeof(container)); 

을 각각의 경우에, 당신은 길이 500*sizeof(container) 바이트의 메모리 블록을 가지고 있고, 반환 된 포인터의 배열의 첫 번째 요소를 가리키는 것으로 간주 될 수있다 500 container 구조체.

+0

하지만 memory [0] = * 항목을 입력하면 해당 항목에 대한 포인터이므로 32 비트 포인터 일뿐입니다. 엔트리를 메모리에 기록해야합니까? – Rio

+0

@Rio : 아니요 -'memory'는 포인터지만'memory [0]'은'struct'입니다. '* entry'와 동일합니다. 그래서 하나의 구조체를 다른 구조체에 할당합니다. 괜찮습니다. – caf

+0

그리고 포인터의 크기는 구현에 따라 다르며 반드시 32 비트 일 필요는 없습니다. –