传递参数使整数指针没有转换
问题描述:
我已经通过堆栈溢出几个类似的问题,但我一直没能找到一个可以帮助我理解这种情况下的警告。尽管如此,我还是在尝试学习C的第一周,所以如果由于缺乏理解而错过了堆栈溢出的其他明显答案,我很抱歉。传递参数使整数指针没有转换
我得到以下警告和注意事项:
warning: passing argument 2 of ‘CheckIfIn’ makes pointer from integer without a cast [enabled by default]
if(CheckIfIn(letter, *Vowels)){
^
note: expected ‘char *’ but argument is of type ‘char’
int CheckIfIn(char ch, char *checkstring) {
当试图编译这段代码:
#include <stdio.h>
#include <string.h>
#define CharSize 1 // in case running on other systems
int CheckIfIn(char ch, char *checkstring) {
int string_len = sizeof(*checkstring)/CharSize;
int a = 0;
for(a = 0; a < string_len && checkstring[a] != '\0'; a++){
if (ch == checkstring[a]) {
return 1;
}
}
return 0;
}
// test function
int main(int argc, char *argv[]){
char letter = 'a';
char *Vowels = "aeiou";
if(CheckIfIn(letter, *Vowels)){
printf("this is a vowel.\n");
}
return 0;
}
答
Vowels
是char*
,*Vowels
只是一个char
, 'A'。 char
会自动提升为整数,您的编译器允许将其隐式转换为指针。但是指针值不会是Vowels
,它将是等于字符'a'的整数编码的地址,几乎通用为0x61。
只需通过Vowels
到您的功能。
+0
谢谢 - 非常清楚的解释 – DanBennett 2014-08-30 19:07:46
修复类型:'CheckIfIn(letter,* Vowels)'应该是'CheckIfIn(letter,Vowels)'。然后'sizeof(* checkstring)/ CharSize'不是你所期望的。 – Jarod42 2014-08-30 16:50:57
'#define CharSize 1 //在其他系统上运行时''''char'的大小始终为1,即使在非8位系统上也是如此。因此,在所有系统上,int string_len = sizeof(* checkstring)/ CharSize;总是计算为1。你需要将一个数组的长度作为一个单独的参数传递给一个函数,或者如果你的数组有一些sentinel值(比如字符串的0字节),可以使用'strlen'这样的函数:'size_t string_len = strlen(checkstring );'。 – mafso 2014-08-30 17:12:22
另外。由于你不想修改元音指向的字符串,所以你应该将它声明为一个'const char *'(一个指向'const'字符串的指针),并将'CheckIfIn'的参数类型从char *到'const char *'。 – John 2014-08-30 18:18:43