2014-09-26 2 views
0

어떻게 memset의 값을 복구 할 수 있습니까? 다른 함수에서memset에 의해 설정된 복구 값

void* my_malloc(size_t sz) 
    void* block = malloc(sz + sizeof(size_t)); 
    void* retval = &block + sizeof(size_t); 
    memset(block, sz, sizeof(size_t)); 
return retval; 

: 다음 코드에서

이 프로그램은 앞서 포인터의 요청 사용자가 사용자에게 반환 크기를 사용자가 요청한 공간의 일정 금액을 할당하고 저장하도록되어 , 사용자는 데이터의 포인터를 전달할 수 있으며 메모리보다 먼저 저장 한 크기를 복구하려고합니다.

void my_free(void *ptr) { 

    void* block = ptr - sizeof(size_t); 
    size_t *sz; 
    memset(sz, block, sizeof(size_t));//This is the line in question. 

free(block); 

어떤 종류의 기억 기능이 있습니까? sz 값을 재설정 할 수 있습니까? 이 현재 방법은 저에게 오류를주고 있습니다

+1

'memset()'에 대한 호출이 생각한대로 작동한다고 생각하지 않습니다. 당신이 묘사 한 바에 따르면,'memset() '을 전혀 사용하지 않으려 고합니다. –

+0

'memset'을 잘못 사용하는 것 외에도,'my_malloc'에서'retval'을 계산하는 것은 완전히 가짜입니다. –

답변

1

정말 memset의 설명서를 읽을 필요가 있습니다. 그것은 메모리의 블록을 모든 바이트가 동일하게 설정합니다.. memset(block, sz, sizeof(size_t))의 효과는 block의 첫 번째 8 (또는 그 크기가 size_t) 바이트를 모두 (unsigned char)sz이되도록 설정하는 것입니다. 그 선이 있어야 할 수 있도록

가 올바른 기능이 memcpy 일부 바이트를 복사하려면 :

memcpy(block, &sz, sizeof sz); 

free 함수에서 당신이 원하는 : 또한

size_t sz; 
memcpy(&sz, block, sizeof sz); 

, 당신이 잘못된 포인터 연산을 장소 :

void *retval = &block + sizeof(size_t); // moves sizeof(size_t) * sizeof(void *) bytes 
void *block = ptr - sizeof(size_t);  // illegal 

정의 o f 포인터 연산은 에 의해 유형의 요소 수가 가리키는 포인터를으로 이동하는 것입니다. 바이트 수라고 가정하는 것 같습니다. 당신이 정말로 원하는 것은, 각각이다 : 포인터 연산이 void *에 대해 정의되어 있지 않기 때문에

void *retval = (char *)block + sizeof(size_t); 
void *block = (char *)ptr - sizeof(size_t); 

캐스트입니다. sizeof(char) == 1 이후 char *에서 포인터 산술을하면 해당 바이트 수만큼 이동합니다.

void *retval = (size_t *)block + 1; 
void *block = (size_t *)ptr - 1; 

마지막으로 size_t보다 더 큰 정렬 요구 사항이 모든 유형의 실패 귀하의 malloc 교체 (비록 : 올바르게 다음 포인터 연산을 이해한다면

당신은 그 문을 작성하는 또 다른 방법이 있음을 알게 될 것이다 시스템에 이러한 유형이없는 것 같습니다).

관련 문제