【问题标题】:Incompatible pointer assignment不兼容的指针分配
【发布时间】:2019-11-21 00:49:10
【问题描述】:

我最近尝试编写如下代码:

extern bool f(const char *const *b);
// SNIP
char *d[] = {/* SNIP */};
char *c[] = {/* SNIP */};
for(size_t i = 0; i < sizeof(d)/sizeof(char *); i++) {
    c[1] = d[i];
    f(c); // WARNING
}

所以这给出了一个警告 “你不能将char ** 分配给const char *const *”。

我明白为什么将char ** 分配给const char ** 是非法的:

const char *f = "cats";
const char **fp;
char *g;
fp = &g;         // Let's pretend it's legal to assign char ** to const char **
*fp = f;         // OK, assigning const char * to const char *
*g--;            // OK, decrementing char -- but g == f!
printf("%s", f); // Prints "bats"

但是,如果我们将 char ** 分配给 const char *const *,则不会发生这种情况:

const char *f = "cats";
const char *const *fp = &f;
char *g;
fp = &g;         // Let's pretend it's legal to assign char ** to const char *const *
*fp = f;         // Illegal, assigning const char * to const char *const
*g--;            // OK, decrementing char -- but g == f!
printf("%s", f); // Prints "bats" (though it won't compile)

所以问题是为什么存在这个要求,因为它不会引起问题。

(FWIW,我使用的是 C99。显然 C++11 允许这样做。)

【问题讨论】:

  • 你能粘贴确切的错误信息吗?几乎可以肯定有重复的问题,但我找不到。
  • 看来你应该可以使用extern bool f(char * const * b);

标签: c


【解决方案1】:

这是语言设计的疏忽,它只允许在第一级隐式添加const

您必须使用强制转换或更改函数参数类型。

Related answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2018-11-17
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多