[英]Double pointer as function parameter
此功能出现时,我正在阅读“理解和使用C指针”页面:
void safeFree(void **pp) {
if (pp != NULL && *pp!= NULL) {
free(*pp);
*pp = NULL;
}
}
以及其中的示例代码:
int main(int argc, char **argv) {
int* pi = (int*)malloc(sizeof(int));
*pi = 5;
safeFree((void**)&pi);
return EXIT_SUCCESS;
}
我的意思是,在这种情况下,在if
条件下检查pp != NULL
是对的吗? 因为根据编写此代码的方式,此条件永远不会为假。 但是在这种情况下,如果**pp
期望一个内存地址并且(假设我)一个变量的内存地址永远不能为NULL
,那么这种情况将为真? 还是作者做了检查,以防有人做了这样的事情?
int main(int argc, char **argv) {
int **pi = NULL;
safeFree((void**)pi);
return EXIT_SUCCESS;
}
谢谢。
该函数主要在第二种情况下检查NULL。 如果通过了实际的变量地址,该检查将不会失败,但永远不要相信您的调用方是理智的。
说了这么多safeFree
只是混乱, 不提供安全性。 因为代码假定API用户将始终传递特别构造的指针。 考虑这些:
#include <stdio.h>
#include <stdlib.h>
void safeFree(void **pp) {
if (pp != NULL && *pp!= NULL) {
free(*pp);
*pp = NULL;
}
}
int main() {
int *a;
int **p;
a = malloc(5 * sizeof(int));
p = malloc(1 * sizeof(a));
a[0] = 10;
p[0] = a;
fprintf(stderr, "%d\n", a[0]);
safeFree((void **)p); /* grrrr */
fprintf(stderr, "%d\n", a[0]);
}
int main() {
int a[] = { };
int b[] = { 1 };
int c[] = { 2 };
int **p = malloc(3 * sizeof(int *));
p[0] = a, p[1] = b, p[2] = c;
safeFree((void **)p); /* grrrr */
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.