我正在查看声明的一些代码,然后初始化指向结构的指针。
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);
答案 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]);