假设以下情况:
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 并释放我分配的空间?
free(myReg);
这将使 myReg 指向 NULL 并释放占用的空间 我分配的?
它只会释放内存。即使不阅读规范,如果您查看 free
函数的声明方式,您会发现它实际上无法更改指针指向的内容。
/* Even if it wanted, `free` can't make `ptr` point to anything else. */
void free(void *ptr);
调用仅释放 free 是分配的内存并将其返回到堆中。它不会将您的 myReg 设置为 NULL。你必须自己做。
一种方法是编写宏,如下所示:
#define MY_FREE(ptr) free(ptr); ptr = NULL;
其他答案是正确的。
为了帮助理解为什么必须如此,请考虑可能有多个指针指向此内存或其不同部分:
Reg *myReg = (Reg*) malloc(sizeof(Reg)*100);
Reg *myReg2 = myReg;
Reg *myReg3 = &myReg[50];
当您释放myReg
时,所有这些指针都保持不变。它们指向与以前相同的内存片段,但不能再使用此内存。
您(程序员(应该将它们设置为 NULL(或者只是避免在释放后使用它们(。
C 找不到所有内容并将它们设置为 NULL。更现代的语言,如Java,知道如何跟踪指向给定对象的所有指针,但C语言没有这样做。