首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qsort指针问题

qsort指针问题
EN

Stack Overflow用户
提问于 2018-04-09 18:46:02
回答 2查看 175关注 0票数 0
代码语言:javascript
复制
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);
}

但是,它给了我以下错误:

代码语言:javascript
复制
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;
                        ^

它的旧写法是这样的:

代码语言:javascript
复制
STATIC int
compare(p1, p2)
    CONST char  **p1;
    CONST char  **p2;
{
    return strcmp(*p1, *p2);
}

我不明白有什么区别..。为什么我搞错了选角?我在这里发现了其他一些类似的问题,这似乎表明我使用的语法应该有效.但显然并非如此。

我宁愿“正确地”这样做,而不仅仅是禁用警告(禁用警告不会通过代码评审)。

编辑:用户chux问如果我设置一个新的var..。结果如下:

代码语言:javascript
复制
const char **s1 = (const char **)p1;

生产:

代码语言:javascript
复制
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;
                       ^
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-09 19:31:54

解决方案不需要任何铸造。

分配const void *的示例

代码语言:javascript
复制
  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的比较。

代码语言:javascript
复制
int compare5(const void *p1, const void *p2) {
  char * const *pp1 = p1;
  char * const *pp2 = p2;
  return strcmp(*pp1, *pp2);
}
票数 0
EN

Stack Overflow用户

发布于 2018-04-09 19:17:22

您还需要创建指向const的指针:

代码语言:javascript
复制
const char *pp1 = *(const char * const *)p1;
const char *pp2 = *(const char * const *)p2;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49739672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档