2013-11-26 5 views
1

내부적으로 사용되는 일부 추가 메타 데이터 공간에 지정된 크기의 공간에 대한 힙 공간을 할당하는 간단한 함수를 만드는 중입니다. 크기 (X)를 할당 할 때 난 단계 수행 할 작업메모리에 메타 데이터 추가

:

  1. 가 X +는 sizeof (구조체 메타) 할당을 이용하여 할당의 malloc의 malloc을 사용. 결과 => start_adr
  2. start_adr의 첫 번째 바이트에
  3. 지정 메타 데이터 +는 sizeof (구조체 메타 데이터) start_adr하는
  4. 반환 포인터

내가 내 인수 메타의 값을 할당하려면 어떻게 2 단계에 문제가 start_adr의 첫 번째 바이트로?

struct metadata{ 
    unsigned char data; 
}; 

void *myMalloc(int size, unsigned char meta){ 
    int meta_sz = sizeof(struct metadata);  // size of metadata 
    void *ptr = (void *)malloc(meta_sz + size); //pointer to our space in memory 

    //Magic code for assigning meta here 

    return (void *)(ptr + meta_sz); // return memory slot (with meta exluded) 
} 
+0

조심해서 조심하십시오. 그대로, 당신이하고있는 것은 이식성이 없으며 (작동 할 때 성능에 심각한 영향을 미칠 수도 있습니다). – Mat

답변

2

몇 가지 구체적인 오류가 발생합니까? 아니면 어떻게 해야할지 모르십니까? 해방 때 기억

struct meta_data * foo = ptr-sizeof(struct meta_data); 
printf("%hhu\n", foo->data); 

:

struct meta_data * foo = ptr; 
foo->data = meta; 

return ptr+sizeof(struct meta_data); 

주어진 읽기만 반환 PTR :

는 나는이만큼 간단해야 제대로 이해하고

void myFree(void * ptr) { 
    void * malloced_ptr = ptr-sizeof(struct meta_data); 
    free(malloced_ptr); 
} 
+0

고맙습니다. 위대한 작품입니다! 나는 그것을 (예 : 메타 읽기) 다른 방법으로 어떻게 할 것인가? –

+0

@AntonGildebrand 어렵습니다. 초기'ptr''malloc()'을 반환하거나, malloc 된 메모리의 길이를 유지해야합니다. 왜냐하면''meta''를 읽으려면'ptr'을 알아야하고, 나중에 메모리를 free() 할 수 있습니다. – Macattack

+0

메타가 항상 주소의 첫 번째 바이트 인 경우에도 이것을 알아야합니까? –

0

에서 할당 된 메모리 공간, 그것의 주소 그것은 첫 번째 바이트에 대한 포인터입니다. 따라서 원하는 메타 데이터를 메타 데이터에 할당하고 반환하면됩니다. 또한, malloc return을 변환 할 필요가 없습니다 (사실, void *이므로, 어쨌든 무의미합니다). meta는 부호없는 char (즉, 1 바이트)이기 때문에이 함수가 작동합니다. 다른 경우에는 ptr을 struct metadata *로 변환해야합니다 (예 : 멤버가 더 많은 경우). 반환 전에 캐스팅 할 필요가 없습니다.

void * myMalloc (int size, unsigned char meta) { int meta_sz = sizeof (struct metadata); // 메타 데이터 크기 void * ptr = (void *) malloc (meta_sz + size); //이 할당 된 메모리 공간에 대한 포인터가 첫 번째 바이트에 대한 포인터 인 규칙을 모순으로이 나쁜 프로그래밍 연습이 될 수 있음을

*ptr = meta; 

return (ptr + meta_sz); // return memory slot (with meta exluded) 

}

주 메모리에 우리의 공간 포인터 그것의. 실제 메타 데이터에 대한 포인터로 작업하면 할당 된 공간의 첫 번째 바이트가 메타 데이터라는 것을 알면 더 좋습니다.

관련 문제