c - 双指针作为函数参数

标签 c pointers free

我正在阅读 "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/

相关文章:

c - fopen + Stream _dup 中的流描述符丢失

c - 哈希表中的链表(带结构)

c - Free() 使程序崩溃

c - 释放内存时无效指针

c - 快速 3D Lut 查找

c - merge_sort算法中,参数为double类型list有效,int类型list无效

c - 在 qsort() 的比较函数中使用结构体中的值 - C99 - 取消引用指向不完整类型的指针

c - free() 函数不起作用

c - free() 错误(使用 valgrind 调试)?

c - 我有旧的 C 程序,我可以在其中看到声明