1

假设以下情况:

typedef struct {
    int ID1;
    int ID2;
    char string[256];
} Reg;

我动态创建一个数组,这个结构:

Reg *myReg = (Reg*) malloc(sizeof(Reg)*100); //array of type Reg with 100 positions.

在整个示例系统中,我填充了这个数组。

有一点我不希望指针“myReg”指向这个向量。我希望他指向NULL。并且还清除了 malloc 占用的内存空间。

问题:

如果我做:

free(myReg);

这将使 myReg 指向 NULL 并释放我分配的空间?

4

3 回答 3

5
free(myReg);

这将使 myReg 指向 NULL 并释放我分配的空间?

它只会释放内存。即使不阅读规范,如果您查看free函数的声明方式,您会发现它实际上无法更改指针指向的内容。

/* Even if it wanted, `free` can't make `ptr` point to anything else. */
void free(void *ptr);
于 2012-05-22T05:54:39.510 回答
3

调用free只释放分配的内存并将其返回到堆中。它不会将您的 myReg 设置为 NULL。你必须自己做。

一种方法是编写如下宏:

#define MY_FREE(ptr) free(ptr); ptr = NULL;
于 2012-05-22T05:57:43.967 回答
2

其他答案是正确的。

为了帮助理解为什么必须这样,考虑可能有多个指针指向这个内存,或者它的不同部分:

Reg *myReg = (Reg*) malloc(sizeof(Reg)*100);
Reg *myReg2 = myReg;
Reg *myReg3 = &myReg[50];

当你 free 时myReg,所有这些指针都不会改变。它们和以前一样指向同一块内存,但不能再使用这块内存。
您,程序员,应该将它们设置为 NULL(或者在空闲后避免使用它们)。
C 无法找到它们并将它们设置为 NULL。更现代的语言,如 Java,知道如何跟踪指向给定对象的所有指针,但 C 不这样做。

于 2012-05-22T06:23:21.347 回答