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

时间:2015-07-16 18:43:21

标签: c pointers free

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

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

此结构的typedef为:

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);

这个的目的是什么,你什么时候使用&符号和免费电话?我以前只是通过提供指针变量名来查看释放内存的代码。

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

3 个答案:

答案 0 :(得分:5)

这是该计划中的一个错误。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

正如已经回答的那样,它是代码中的一个错误。唯一符号可与free一起使用的唯一情况是使用类似数组的表示法:

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

然后

free(p);

等同于

free(&p[0]);