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;
关于c - qsort const指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49739672/