- 主题:该如何解释主函数的实参和子函数的形参不同引起的编译错误?
void my_strlen( char *str)
{
int count=0;
while(*str!='\0')
{
str++;
count++;
}
printf("%d\n",count);
}
int main()
{
const char arr[]="hello bit";
my_strlen(arr);
return 0;
}
函数调用时不是只传值嘛,上面这段程序为啥有编译错误,而下面这段就没事:
void my_strlen( const char *str)
{
int count=0;
while(*str!='\0')
{
str++;
count++;
}
printf("%d\n",count);
}
int main()
{
char arr[]="hello bit";
my_strlen(arr);
return 0;
}
--
FROM 219.142.153.*
编译报警告类型不匹配
因为无法保证把 const char* 转换成 char* 类型后的程序安全
你反过来传,编译器可以安全地把char* 转换成const char* ,当然就不报错了
【 在 sqsl 的大作中提到: 】
: void my_strlen( char *str)
: {
: int count=0;
: ...................
--
FROM 120.231.170.*
是确认变量属于同一类别之后的传值,而不是传递变量啊,所以也不涉及类型转换吧?
【 在 hehao 的大作中提到: 】
: 编译报警告类型不匹配
: 因为无法保证把 const char* 转换成 char* 类型后的程序安全
: 你反过来传,编译器可以安全地把char* 转换成const char* ,当然就不报错了
: ...................
--
FROM 111.193.235.*
你已经解决这个问题了,就只能这样了。
这个警告是非常必要的,完全正确。
【 在 sqsl 的大作中提到: 】
: void my_strlen( char *str)
: {
: int count=0;
: ...................
--
FROM 221.221.52.*
【 在 sqsl 的大作中提到: 】
: 是确认变量属于同一类别之后的传值,而不是传递变量啊,所以也不涉及类型转换吧?
:
char arr[]="hello bit";
arr 是一个字符数组, 也可以认为是一个常量字符串首地址。
子函数定义成接受字符串指针, 隐含了从常量字符串指针转换成字符串指针的形参实参转换。
你不改变函数参数, 就需要在调用的地方, 做强转。
--
FROM 115.171.245.*