繁体   English   中英

双指针作为函数参数

[英]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用户将始终传递特别构造的指针。 考虑这些:

棘手的0(拧紧一个)

#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 */
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM