【问题标题】:Why am I getting an incompatible pointer types error?为什么我会收到不兼容的指针类型错误?
【发布时间】:2012-02-07 22:49:56
【问题描述】:

我研究过 C 指针,想知道为什么编译器会在以下代码中发出不兼容的指针类型错误:

#include <stdio.h>


const char *months(int n);
int main() {
    char **p = months(2);

    printf("%s", **p);
}

const char *months(int n) {
  const char *m[] = {
        "Invalid month",
        "January",
        "February",
        "March",
        "Aprli"
    };
    return (n == 0 || n > 12) ? m[0] : m[n];
}

我希望 printf 将“二月”显示为月份,但我得到了那个错误 “使用 'const char *' 类型的表达式初始化 'char **' 的不兼容指针类型” 在编译过程中。

如果月份函数没有错误,则返回指向“n”个月的指针。接下来我创建一个指针 p 来指向月份函数的结果。

这里有什么问题?

【问题讨论】:

  • 声明并使用p 作为指向 char 的指针,而不是指向指向 char 的指针。
  • 您可能还想在months() 函数中检查是否为负n

标签: c


【解决方案1】:
char **p = months(2);

应该是

const char *p = month(2);

因为您的 month 函数返回 const char * 而不是 char **

printf("%s", **p);

应该是

printf("%s", p);

因为p 是指向您的字符串的指针。

【讨论】:

    【解决方案2】:

    p需要匹配months的返回类型,即const char *。这应该有效:

    const char *p = months(2);
    printf("%s", p);  // no need to dereference to *p here
    

    【讨论】:

    • 好吧。为什么 printf("%s", p) 有效?我认为 p 显示内存地址而不是值
    • 是的,printf() 想知道它应该在哪个内存地址“开始打印”。 *p 会传递第一个 char 的值,这不是你想要的,对吧?
    【解决方案3】:
    const char *months
    

    这会返回一个const char*

    char **p = months(2);
    

    这会尝试将const char* 转换为char**

    错误是转换。

    正确的方法是

    const char *p = months(2);
    

    【讨论】:

      【解决方案4】:

      如果不将结果存储在某处,您就不能有一个“指向结果的指针”,您试图将结果(即char *)存储在char * * 类型的变量中,而这并没有没用。

      你需要:

      char *result = (char *) month();
      char **p = &result;
      

      另外,您应该将m 向量设为static,因为返回指向函数的局部变量的指针有点粗鲁。

      我添加了演员表,因为你放弃了 constness,这也有点难看,但我不想改变太多。

      【讨论】:

      • 您添加了演员,否则您的代码将无效。没有从const char *char * 的隐式转换。
      • 返回一个指向局部变量的指针不仅仅是“恶心”,它不起作用。它的内存随时可能被覆盖。
      • @ugoren:通常是的,但我很确定这在“大多数”情况下都有效,因为无论如何数据只是一个静态字符串。
      【解决方案5】:

      试试这个!

      #include <stdio.h>
      
      const char *months(int n); 
      
      int main(void) 
      {
          const char *p = months(2);
          printf("%s \n", p); 
          return 0;
      }
      
      const char *months(int n)  
      {
          const char *m[] = { 
              "Invalid month",
              "January",
              "February",
              "March",
              "Aprli"
          };  
          return (n == 0 || n > 12) ? m[0] : m[n];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多