2014-03-30 2 views
1

메모리 풀 구현에 대해 혼동합니다. 나는 메모리 풀 생성 :은 메모리 풀을 구현합니다.

typedef struct POOL 
{ 
    struct POOL *p_next; 
    unsigned short size; 
    unsigned short used; 
}pool; 

pool *p; 
p=malloc(pool_size+sizeof(pool)); 
p->size= pool_size; 
p->used= 0; 

을 지금은 너무, 블록 _ 크기와 블록으로이 메모리 풀을 분할

typedef struct BLOCK 
{ 
unsigned short size; 
struct BLOCK *b_next; 
}block; 

block *b=NULL; 
b=(block *)&p[block_size+sizeof(block)]; 
b->size=block_size; 
memset(b,0,size+sizeof(block)); 
p->used+=(size+sizeof(block)); 

원하고 지금은 블록 (b)의 메모리를 사용하려면, 그래서 단지

strcpy(b, "hello, world!"); 

으로 올바르게 사용하고 있습니까? 문제를 어떻게 해결할 수 있습니까? 다음

b=(block *)&p[block_size+sizeof(block)]; 

p에서

+0

'풀'이란 무엇입니까? 그것은'struct'입니까? –

+0

예, 구조체는 풀 크기, 풀 ID 및 다음 풀에 대한 포인터에 대한 정보를 포함합니다. 블록 또한 구조체입니다. – vera

+0

구조체를 더 자세히 설명해야합니다. & p는 포인터입니다. 'sizeof (pool)'은 블록의 크기가 아닌 포인터의 크기입니다.'pool'은 같은 것을 가리 킵니다. 'sizeof (블록)'. – brokenfoot

답변

0

pool에 대한 포인터, 그래서 당신이 그것에 배열 인덱스를 사용하는 경우, 오프셋은 pool 구조체의 크기를 곱한 것입니다. 이것은 아마도 당신이 의도 한 것이 아닙니다. 당신은 아마

p+1 

난 당신이 풀 헤더 후 메모리를 개척하는 데 사용할 어떤 정책 또는 정렬 요구 사항을 처리하려는 방법을 모르는 것 풀 구조체, 뛰어 넘고 싶어 , 그래서 너는 그것보다 더 많은 오프셋이 필요하다고 말할 수 없다.

다음으로 블록 구조체의 블록 크기를 채운 다음 memset으로 전체를 닦습니다.

그래서 구현하려는 풀 할당 자의 종류를 알지 못하면 내가 할 수있는 최선의 방법은 실제 질문에 대한 대답이며 대답은 '아니오'입니다. 올바르게 수행하지 못합니다.

+0

여기 내가 무엇을하려고하는지 : * p = malloc (1000)이 있다면, 메모리 p를 200과 300의 블록으로 나누고 블록의 주소를 얻어서 사용하고 싶습니다. 나는 그것을 어떻게 구현하는지 혼란 스럽다. – vera

+0

포인터를'uint8_t *'또는'uintptr_t'로 형변환하여 바이트 단위로 산술 연산을 수행 한 다음 실제로 원하는 유형으로 캐스트하십시오. 무료 주소를 계산할 때 풀 및 블록 헤더를 기억하십시오. 제어 구조 위에 블록을 할당하고 싶지는 않습니다! – pat

관련 문제