2013-05-04 1 views
0

포인터에 대한 자세한 내용을 보려면 포인터를 생성하는 간단한 테스트 함수를 작성하고 쉘에서 일부 출력 후에 공간을 확보해야합니다.malloc의 간단한 테스트와 int 포인터로 free가 double free 또는 corruption 에러를 야기 함

void main() { 
    int *p = (int*) malloc(sizeof(int)); 
    int a = 42; 
    printf("p: %x\n", p); 
    printf("*p: %d\n", *p); 
    printf("a: %s\n", a); 
    printf("&a: %x\n", &a); 
    p = &a; 
    printf("p: %x\n", p); 
    printf("*p: %x\n", *p); 

    //Until now everything works as expected 
    free(p); //ERROR 
    // printf("p: %x\n", p); // Shall cause error, because space was freed 
    // printf("*p: %x\n", *p); // Shall cause error, because space was freed 
} 

처음에는 모든 것이 정상적으로 실행되었습니다. free (p) 오류가 발생하지 않았습니다. 그럼 구조체와 동일한 테스트를 시도하고 이중 자유 오류가있어. "좋아, 어쩌면 내가 뭔가 잘못 했어. 시작하러 갈 수있어."나는 전에 생각했던 것보다 Ctrl + Z를이 모든 것으로 생각했다. 지금 나는 아직도이 오류를 얻는다. 왜? 그게 초보자 질문이야. 알아. 위의 코드는 malloc과 free의 간단한 데모로 웹의 모든 곳에서 찾을 수 있습니다. 여기처럼 : http://www.cplusplus.com/reference/cstdlib/free/ 희망, 누군가 내가 뭘 잘못했는지 말할 수 있습니다.

답변

3

free()에 전달 된 포인터가malloc() (또는 calloc() 또는 realloc())에 대한 이전 호출에서 반환해야합니다.

p = &a; 

p 다음 정의되지 않은 동작을 일으키는 free()에 전달됩니다 pa의 주소를 가지고 이것은 사실이 아니다.

동적 할당 기능 중 하나를 호출 한 후 포인터가 다시 할당되는 질문에 링크 된 페이지의 예에서 유의하십시오.


다음 코드의 주석 "Shall cause error, because space was freed"이 잘못되었습니다 :

free(p); //ERROR 
// printf("p: %x\n", p); // Shall cause error, because space was freed 

는 관계없이, 포인터의 주소를 인쇄하는 것이 안전으로는 free()을하고있다과 관련되어있는 메모리 여부 아닙니다. 당신이 free() D되었습니다 메모리에 액세스하려고하면 그것은 오류이기 때문에,이 댓글은 올바른 :

// printf("*p: %x\n", *p); // Shall cause error, because space was freed 

p 때문에이 deferenced되고 있으며 시도가 free() D 메모리가 발생 읽을 수 있습니다. 포인터에 대한 %p 형식 지정자를 사용

printf("p: %x\n", p); 

가 정의되지 않은 동작이도 : 그

printf("a: %s\n", a); /* Must be '%d' as 'a' is an 'int'. */ 

참고 :


는 오류입니다. 이 약간의 도움이 Correct format specifier to print pointer (address)?


Do I cast the result of malloc?

+0

아를 (각각의 malloc은 힙에서 메모리에 당신에게 블록을 제공 기억) 할 수 있습니다 기억하십시오. 따라서 free는 스택에 있고 힙에는없는 공간을 할당 해제하려고 시도합니다. 게다가 원래 할당 된 공간은 여전히 ​​존재하며 해제되지 않았으며 나는 그에게 가리킬 수 없습니다. 맞습니까? –

+0

@PhantomasPhantom, 맞습니다. 할당으로 인해 메모리 누수가 발생합니다. – hmjd

+0

그게 우리가 명시 적으로 배운 게 아니에요. 도와 줘서 고마워. 나는 이것을 몇 시간 동안 테스트 해왔다. 지금은 이해. –

0
void main() { 
    int *p = (int*) malloc(sizeof(int)); // here is error number one. 
             // you casted your fresh malloc'd int 
             // to an int* 
             // which is not what you want to do 
             // get rid of the cast you don't need it. 

    // here is where your problem continues. 
    int a = 42; // this variable A was created on the stack not the heap!! 
       //you cant free this, which is what you are doing below. 
    printf("p: %x\n", p); 
    printf("*p: %d\n", *p); 
    printf("a: %s\n", a); 
    printf("&a: %x\n", &a); 

    p = &a; // this is a correct statement. 
      // you getting the address of var a 
      // and making pointer p point to A's contents. 
    printf("p: %x\n", p); 
    printf("*p: %x\n", *p); 

    //Until now everything works as expected 
    free(p); //ERROR: here you are trying to free var A 
      // but you cant because it wasnt dynamically allocated. 
    // printf("p: %x\n", p); // Shall cause error, because space was freed 
    // printf("*p: %x\n", *p); // Shall cause error, because space was freed 
} 

희망을 참조하십시오. K & R (Kernegie and Richie) C 프로그래밍 언어 책의 포인터에서 CH 5를 읽는 것이 좋습니다. 정말 짧아서 어딘가에서 무료로 찾을 수 있습니다. 사실 저는 당신이 전체 책을 읽었습니다. 밖에있는 최고의 책. 는 내가 완전히 감독 무엇을, 당신은 무료로 당신이 malloc으로 할당 된 것을

+0

주조는 맛 좀 일이 될 것 같다 두 번째 대답에 클릭했습니다. 어떤 사람들은 "안돼, 절대 던지지 말아라", 다른 사람들은 "던지다"라고 말한다. https://www.securecoding.cert.org/confluence/display/seccode/MEM02-C.+Immediately+cast+the+result+of+a+memory+allocation+function+call+into+a+pointer+ ~ + 할당 된 + 유형 –

관련 문제