簡體   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