c - qsort const指针问题

标签 c pointers casting constants

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/

相关文章:

c++ - 指针操作的未知使用

c - 将指针存储在 vector 中

c++ - HWND abc = 0x100;这行不通,我明白为什么。那怎么办呢?

c - 狡猾的指针表达式 (int*)arr

c - 排序网络如何击败通用排序算法?

java - 转换为接口(interface)类型后确定原始对象类型

c# - 对象自动拆箱

c++ - 错误: ‘void*’ is not a pointer-to-object type error while dynamically opening multiple shared libraries

c - 标记双向链表中的当前位置

c# - 就我而言,用 C# 编写服务器应用程序是否合理?