我只使用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)不正确?怎么做?
答案 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。您可以使用valgrind或address sanitizers等工具,因为它们非常有助于捕获memory leak或buffer 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
。