我正在阅读 "Understanding and Using C Pointers" 的一页当这个功能出现时:
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;
}
谢谢。
最佳答案
话虽如此,safeFree
只是令人困惑,而且不 提供安全性。因为代码假定 API 用户将始终传递一个特别构造的指针。考虑这些:
棘手的 0(搞砸了 a)
#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]);
}
棘手的 1(崩溃)
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 */
}
关于c - 双指针作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47998777/