为什么free()之后指针不为null(没有复制指针)

时间:2018-05-01 05:31:03

标签: c pointers nullable

我只使用main()函数。不复制任何指针。 为什么free()函数不能获得NULL值? 我可以检查我的可靠性是满还是空?

#include <stdio.h>
#include <stdlib.h>

int main()
{
int *e = NULL;

 printf("before e=%p\n",(void *)e);
 e = malloc(sizeof(int));
 *e = 7;
 printf("after,  e=%p\n",(void *)e);
 if(e == NULL) { printf("Problemy z pamięcia\n"); return 0; }
 printf(" value = %d\n",*e);

 free(e);
 printf("after free,  e=%p\n",(void *)e);
 if(e == NULL) printf("is NULL\n");

return 1;
}

结果

before e=0
after,  e=464027a0
 value = 7
after free,  e=0x7f82464027a0

为什么如果(e == NULL)不正确?怎么做?

1 个答案:

答案 0 :(得分:4)

因为C具有call-by-value策略,free是标准函数。每个函数调用都不会修改其参数,因为形式参数包含调用时传递的参数的副本

在实践中,您可以使用comma operator并系统地执行

  free(e), e = NULL;

但是,在free之后使用指针(值) - d是undefined behavior。是UB的scared,所以请详细了解它。

您应该编译所有警告和调试信息(所以gcc -Wall -Wextra -g if使用GCC)并学习use the gdb debugger。您可以使用valgrindaddress sanitizers等工具,因为它们非常有助于捕获memory leakbuffer overflow等错误。

是的,你的代码错了。您没有针对malloc的失败进行测试(您的if(e == NULL)为时已晚,当*e = 7;失败时,前一个malloc可能会获得segmentation fault ),你真的应该编写至少类似的代码:

 e = malloc(sizeof(int));
 if (!e) { perror("malloc e"); exit(EXIT_FAILURE); };

为了便于阅读,上面的!e可以替换为e==NULL