在调用 free() 时使用符号 (&)

Using an ampersand (&) in a call to free()

我正在查看的一些代码声明并稍后初始化指向结构的指针。

mcsConsole_t *mcsConsole;
mcsConsole = (mcsConsole_t *) malloc(sizeof (mcsConsole_t) );

这个结构的类型定义是:

typedef struct {
    unsigned int   reqType;             /* Request Type                */
    unsigned int   consoleID;           /* Console ID                  */
    int            returnCode;          /* Return code                 */
    int            reasonCode;          /* Reason code                 */
    unsigned int   ecbArea;             /* ECB posted for responses    */
    char           reserved[4];         /* Available                   */
    cmdRequest_t  *cmdRequest;          /* Pointer to command request  */
    cmdResponse_t *cmdResponse;         /* Pointer to command response */
} mcsConsole_t;

释放此内存后,指针名称前会包含一个和号。

free(&mcsConsole);

这样做的目的是什么?什么时候在调用 free 时使用 & 符号?我习惯于看到通过简单地提供指针变量名来释放内存的代码。

int *ptr = malloc( sizeof(*ptr) );
free(ptr);

这是程序中的错误。

指向的对象是 mcsConsole 如果在文件范围内声明则具有静态存储持续时间,如果在块范围内声明则具有自动存储持续时间。您只能释放具有 已分配 存储持续时间的对象。

如果您在程序中看到 free(&p)p 不是宏,则可能是一个错误。

那个 & 符号正在获取 mcsConsole 的地址,它本身是指向 mcsConsole_t 结构的指针。我想不出对 free 的调用有效的 单个 场景。系统将尝试 free 指针 ,它在堆栈上(或可能是静态的),就好像它是在堆上分配的结构一样。这闻起来像一个错误,而且是一个特别糟糕的错误。

如前所述,这是代码中的错误。符号表示法可以与 free 一起使用的唯一情况是类似数组的表示法:

sometype_t *p = malloc(sizeof(sometype_t) * n);

然后

free(p);

等同于

free(&p[0]);