为什么在这个例子中使用q?

时间:2014-05-20 00:00:36

标签: c

"Compliant Solution" code example中,使用变量q

但是,我不确定为什么在这种情况下应该使用q

char *p = /* Initialize; may or may not be NULL */
char *q = NULL;
if (p == NULL) {
  q = (char *) malloc(BUF_SIZE);
  p = q;
}
if (p == NULL) {
  /* Handle malloc() error */
  return;
}

/* Perform some computation based on p */
free(q);
q = NULL;

相反,以下代码的行为与上面的代码相同吗?

char *p = /* Initialize; may or may not be NULL */
if (p == NULL) {
  p = (char *) malloc(BUF_SIZE);
}
if (p == NULL) {
  /* Handle malloc() error */
  return;
}

/* Perform some computation based on p */

2 个答案:

答案 0 :(得分:4)

只有在您保证p未被修改的情况下,您的代码才有效。

q的原因是让你清理malloc内存的结果,而不要求p保持不变。由于q存储了从malloc获取的指针,因此允许标记为“根据p执行某些计算”的代码块修改p - 例如,在循环中递增它。 q的值将继续指向malloc - ed块,让您free内存代码已分配。

答案 1 :(得分:4)

如果您按照提供的链接,可以阅读以下文字:

  

在此兼容解决方案中,第二个指针q用于指示是否调用malloc();如果没有,q仍设置为NULL。将NULL传递给free()可确保安全无效。

因此,q的目的是让您的代码确定是否调用了malloc()

如果p不是NULL,则不会调用malloc()qNULL。如果pNULL,则会调用malloc()q为非NULL

我个人认为这是一个奇怪的例子,几乎混淆了。这可能比简单的代码略微提高性能并不值得这么奇怪。

我会写:

#include <stdbool.h>

char *p = /* Initialize; may or may not be NULL */
bool malloc_was_called = false;
if (p == NULL) {
  p = (char *) malloc(BUF_SIZE);
  malloc_was_called = true;
}
if (p == NULL) {
  /* Handle malloc() error */
  return;
}

/* Perform some computation based on p */
if (malloc_was_called) {
    free(p);
    p = NULL;
}

编辑:我没有立即清楚,但使用q的目的是释放内存,但仅限于函数分配。如果p指向某事,我们就不会将其释放;但如果我们分配了内存,我们就会释放它。之前它很棘手,但我的重写让IMHO更加清晰。