【问题标题】:Why pointer is not null after free() (no copy pointer) [duplicate]为什么 free() 之后指针不为空(无复制指针)[重复]
【发布时间】:2018-10-11 05:05:12
【问题描述】:

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

#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

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

【问题讨论】:

  • 为什么要得到一个NULL值?
  • 因为我需要在 free() 之后检查它是 'e' 释放 free() 还是不是我的程序。有时我是否免费使用。关于“e”的信息是随机的,在下一行之后为空对我来说很重要
  • free 只是释放与指针关联的内存。它不会将变量值设置为 NULL。您需要手动执行此操作。
  • @AlojzyDrabina - 为什么你认为你需要检查?您是否检查编译器是否正确执行算术?只是不要泄漏内存,并且无需信任。
  • 更有理由勤奋并且不泄漏内存。您正在寻找一种语言/库解决方案来解决本质上是设计/编程问题。

标签: c pointers nullable


【解决方案1】:

因为 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 leaks 或buffer overflows 之类的错误。

顺便说一句,你的代码是错误的。您没有针对malloc 的失败进行测试(您的if(e == NULL) 为时已晚,并且当malloc 失败时,前面的*e = 7; 可能会得到segmentation fault),并且您确实应该至少编写一些代码喜欢:

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

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

【讨论】:

  • free(e), e = NULL。看起来是个不错的方法。
猜你喜欢
  • 1970-01-01
  • 2011-06-19
  • 2012-03-27
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
相关资源
最近更新 更多