我研究了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来指向月份函数的结果.
这有什么不对?
如果不将结果存储在某处,您就不能拥有"指向结果的指针",您试图将结果(即char *)存储在类型的变量中char * *并且不起作用.
你需要:
char *result = (char *) month();
char **p = &result;
Run Code Online (Sandbox Code Playgroud)
此外,您应该创建m向量static,因为返回指向函数局部变量的指针有点严重.
我添加了演员,因为你放弃了这个const,这也有点难看,但我不想改变太多.