簡體   English   中英

qsort const指針問題

[英]qsort const pointer problems

char  **av;
SIZE_T  ac;

char WordCopy[256] = {0};
av[ac] = strdup(p);

qsort(av, ac, sizeof (char *), compare);

STATIC int compare(const void *p1, const void *p2)
{
    const char *pp1 = *(const char **)p1;
    const char *pp2 = *(const char **)p2;
    return strcmp(pp1, pp2);
}

但是,它給了我以下錯誤:

complete.c: In function ‘compare’:
complete.c:26:24: error: cast discards ‘__attribute__((const))’ qualifier from pointer target type [-Werror=cast-qual]
     const char *pp1 = *(const char **)p1;
                        ^
complete.c:27:24: error: cast discards ‘__attribute__((const))’ qualifier from pointer target type [-Werror=cast-qual]
     const char *pp2 = *(const char **)p2;
                        ^

它的舊編寫方式有效:

STATIC int
compare(p1, p2)
    CONST char  **p1;
    CONST char  **p2;
{
    return strcmp(*p1, *p2);
}

我不知道有什么區別...為什么會出現投放錯誤? 我在這里發現了其他一些類似的問題,這似乎表明我使用的語法應該可以工作……但是顯然不行。

我寧願“適當地”執行此操作,而不僅僅是禁用警告(禁用警告不會通過代碼審查)。

編輯 :用戶chux問如果我設置一個新的變量會發生什么。這是結果:

const char **s1 = (const char **)p1;

產生:

complete.c: In function ‘compare’:
complete.c:26:23: error: cast discards ‘__attribute__((const))’ qualifier from pointer target type [-Werror=cast-qual]
     const char **s1 = (const char **)p1;
                       ^

您還需要使指針指向const

const char *pp1 = *(const char * const *)p1;
const char *pp2 = *(const char * const *)p2;

解決方案不需要任何強制類型轉換。

分配const void *示例

  const void *p1 = NULL;
  char *q1 = p1;        // warning: initialization discards 'const' qualifier from pointer target type
  const char *q2 = p1;
  const char **q3 = p1; // warning: initialization discards 'const' qualifier from pointer target type
  const char * const *q4 = p1;
  char * const *q5 = p1;

const void *p1指向const數據。 分配目標類型也必須是指向const數據的類型。 上面的q1q3不指向const數據。 q4,q5用於OP的比較。

int compare5(const void *p1, const void *p2) {
  char * const *pp1 = p1;
  char * const *pp2 = p2;
  return strcmp(*pp1, *pp2);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM