gcc (GCC) 4.7.0
c89
你好,
我想知道我在这里的想法是否正确。当我使用 malloc 分配内存时。malloc 将返回一个指向内存大小的指针。
因此,在我分配内存之前,所有指针的值都将为 NULL。
使用此代码段:
struct address *db_row = NULL;
db_row = malloc(sizeof(struct address));
db_row->name = malloc(sizeof(char) * 10);
db_row->email = malloc(sizeof(char) *10);
free(db_row->name);
free(db_row->email);
free(db_row);
在分配内存之前,我已经在 db_row 的 gdb 调试器中完成了此操作:
(gdb) p db_row
$20 = (struct address *) 0x0
(gdb) p *db_row
Cannot access memory at address 0x0
这是正确的,因为没有分配内存地址。在我分配内存后,当我做同样的事情时,我会得到以下信息:
(gdb) p db_row
$25 = (struct address *) 0x602310
(gdb) p *db_row
$26 = {id = 0, set = 0, name = 0x0, email = 0x0}
但是,在我释放内存之后,我仍然得到相同的内存地址,在分配任何内存之前,它不应该像第一种情况那样为 NULL 吗?
释放内存后:
(gdb) p db_row
$28 = (struct address *) 0x602310
(gdb) p *db_row
$27 = {id = 6300480, set = 0, name = 0x602330 "", email = 0x602350 " #`"}
如您所见,它仍然指向相同的内存位置,这是正确的吗?
最后,我在最后添加了这个,看看我是否可以做双重免费:
if(db_row != NULL) {
free(db_row);
}
if(db_row != NULL) {
free(db_row);
}
我在第二次调用 free 时得到了堆栈转储。但是作为一项安全措施,您是否应该始终检查以确保您没有尝试进行双重免费?
释放指针后是否值得将指针设置为 NULL?
db_row = NULL;
非常感谢您的任何建议,