为什么我会收到不兼容的指针类型错误?

时间:2012-01-11 15:16:52

标签: c

我研究过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来指向月份函数的结果。

这里有什么问题?

5 个答案:

答案 0 :(得分:5)

如果不将结果存储在某处,则不能有“指向结果的指针”,而是尝试将结果(char *)存储在char * *类型的变量中这不起作用。

你需要:

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

此外,您应该设置m向量static,因为返回指向函数局部变量的指针有点严重。

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

char **p = months(2);

应该是

const char *p = month(2);

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

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

应该是

printf("%s", p);

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

答案 3 :(得分:0)

const char *months

这会返回const char*

char **p = months(2);

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

转换有什么问题。

正确的方法是

const char *p = months(2);

答案 4 :(得分:0)

试试这个!

#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];
}