2011-04-10 54 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