2011-04-10 5 views
4

동적으로 할당되지 않은 변수를 가리키는 struct 멤버가 어떻게되는지 궁금합니다. 그래서 :구조체 포인터 멤버 및 메모리 관리

#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    int value; 
    int *pointer; 
} MyStruct; 

int year = 1989; 

int main (int argc, const char * argv[]) { 

    MyStruct *myStruct = (MyStruct *) malloc(sizeof(MyStruct)); 

    myStruct->value = 100; 
    myStruct->pointer = &year; 

    year++; 

    printf("%d \n", *myStruct->pointer); 

    // what happens to the myStruct->pointer member when we free myStruct ? 
    free(myStruct); 

    return EXIT_SUCCESS; 
} 

나는 올바른 년에 더 이상 포인트를 파괴 것 같은데요? 만약 그렇다면, 포인터가 함수를 가리키고 있다면 포인터는 똑같을 것이다. 이 같은

:

typedef struct { 
    int value; 
    void (*someFunc)(); 
} MyStruct; 

그리고 나중에 :

void sayHi(){ 
    printf("hi"); 
} 

... 

myStruct->someFunc = sayHi; 

제외하고 필요한 특별한 정리 무료() 우리의 구조체가 malloc을 사용하여 만든 경우? 누구에게나 통찰력을 주셔서 감사합니다.

답변

7

malloc (또는 calloc/strdup/realloc)을 사용하지 않았다면 해제 할 필요가 없습니다. 특별한 것은 필요 없습니다. 멤버 변수는 단지 뭔가를 가리키고, 논리적으로 메모리를 지적하지는 않습니다.

귀하의 year 멤버 변수는 여전히 존재하고 free(myStruct) 후 완벽하게 유효합니다 - myStruct->pointer하지만

+0

멋진 사용하는 것이 유효 할 것이다. 그것이 내가 생각했던 거죠. (upvote에 더 많은 담당자가 필요하지만, 내가 그것을 가질 때). –

+0

@ 랄프 D : 걱정할 필요가 없습니다. 잠시 기다리십시오.이 답변을 명확하게 설명하는 측면에서 어느 대답이 가장 적합한 지 확인한 다음 그 대답을 수락하십시오. 그러면 다음 사람이이 질문을 찾는 데 도움이됩니다. – Erik

+0

빠른 응답을 보내 주셔서 다시 한번 감사드립니다. 나는 C를 배우는 것을 정말로 즐겁게하고있다. –