在"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 */
答案 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()
,q
为NULL
。如果p
为NULL
,则会调用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更加清晰。