2011-04-10 70 views
4

我想知道結構成員指向一個非動態分配的變量會發生什麼。所以:結構指針成員和內存管理

#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,但我會的時候我有)。 – 2011-04-10 21:41:46

+0

@Ralph D:不用擔心。稍等片刻,看清楚哪個答案最好解釋清楚,然後接受答案 - 這將有助於下一個人找到這個問題。 – Erik 2011-04-10 21:44:20

+0

再次感謝您的快速響應。我真的很享受學習C. – 2011-04-11 01:01:21