qsort const指针问题

时间:2018-04-09 18:46:03

标签: c pointers casting const

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询问如果我设置了一个新的var会发生什么..这是结果:

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;
                       ^

2 个答案:

答案 0 :(得分:2)

您需要将指针指向const char *pp1 = *(const char * const *)p1; const char *pp2 = *(const char * const *)p2;

new = [1,2,3,4,5]
counter = 0
newLst = []
while counter <= 10:
   counter = counter + 1
   for i in new:
       i = i * 1.1
       newLst.append(i)
print(newLst)

答案 1 :(得分:0)

解决方案不需要任何演员。

分配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);
}