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

pr1*_*m3x 2 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];
}
Run Code Online (Sandbox Code Playgroud)

我希望printf在月份显示"二月",但是在编译过程中我得到了错误"不兼容的指针类型初始化'char**',表达式为'const char*'".

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

这有什么不对?

unw*_*ind 5

如果不将结果存储在某处,您就不能拥有"指向结果的指针",您试图将结果(即char *)存储在类型的变量中char * *并且不起作用.

你需要:

char *result = (char *) month();
char **p = &result;
Run Code Online (Sandbox Code Playgroud)

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

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