struct指针成员和内存管理

Ral*_*h D 4 c memory-management

我想知道指向非动态分配变量的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;
}
Run Code Online (Sandbox Code Playgroud)

我认为它被摧毁了一年不再正确吗?如果是这种情况,如果*指针指向一个函数,那么同样如此吗?

像这样:

typedef struct {
    int value;
    void (*someFunc)();
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

然后呢:

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

...

myStruct->someFunc = sayHi;
Run Code Online (Sandbox Code Playgroud)

如果我们的结构是用malloc创建的,除了free()之外不需要特殊的清理工作吗?感谢任何人的见解.

Eri*_*rik 7

如果你没有malloc(或calloc/strdup/realloc)它,你不需要释放它.没有什么特别需要 - 成员变量只指向某个东西,它在逻辑上并不"拥有"指向的内存.

您的year成员变量仍然存在,并且在您之后完全有效free(myStruct)- myStruct->pointer尽管使用无效