我研究过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来指向月份函数的结果。
这里有什么问题?
答案 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];
}