释放 C 语言中结构的内存数组



假设以下情况:

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语言没有这样做。

相关内容

  • 没有找到相关文章

最新更新