不兼容的指针类型错误[C]

时间:2009-04-15 05:21:55

标签: c pointers compiler-construction types arguments

我不断被告知在这行代码中从不兼容的指针类型传递参数 这是代码行:

if (linear_search (size_of_A, argv[i]))  

这是什么意思,我该如何解决?这是整个计划:

int linear_search ( int size_of_A, char*argv[]){  
   int i;  
   i = 2;  
   while (i <= size_of_A - 1){  
      if (!strcmp (argv [1], argv[i])){  
      return 1;  
      }  
   }  
   return 0;  
}  

int main (int argc, char*argv []){  
   int size_of_A = argc - 2;  
   int i = 2;  
      if (linear_search (size_of_A, argv)){  
         printf ("%s not found\n", argv [1]);  
         return 1;  
      } else{  
         printf ("%s found\n", argv[1]);  
         return 0;  
      }  
      i = i + 1;  
   }  
}   

好的,这修复了警告,但现在当我通过编译器运行程序时没有任何反应。它应该告诉我第一个论点是否重复 例如,输出看起来像:

./a 3 hso 8 3  
3 found 

10 个答案:

答案 0 :(得分:4)

linear_search期待数据类型“char **”。您正在传递argv[i],这只是char*。尝试传递“argv”,如下所示:

if (linear_search(size_of_A, argv))

答案 1 :(得分:2)

linear_search中存在逻辑错误。您有一个基于i值的while循环,但i永远不会更改。您可能缺少i++;指令。

另外(虽然这不会改变程序的行为):i中的变量main从未真正使用过。您可以删除它和i = i + 1;指令。

答案 2 :(得分:1)

您正在将参数(第二个)传递给linear_search函数,该函数与参数的预期类型不匹配。 argv [i]的类型为char *,通常称为字符串,而linear_search函数需要char * [],这是一个字符串数组。

答案 3 :(得分:1)

您的线性搜索功能仅将argv [1]与argv [2]进行比较,因为 i 永远不会增加。一个可能的解决方案(使用for循环而不是while,这是更常见的)将是:

int linear_search ( int size_of_A, char*argv[]){  
   int i = 0;  // should always initialize in construction
   for ( i = 2; i < size_of_A; ++i ) {
      if (!strcmp (argv [1], argv[i])){  
        return 1;  
      }  
   }  
   return 0;  
}

变量 i 永远不会在main中使用,你可以安全地删除处理它的两行。

答案 4 :(得分:0)

您的函数需要char*[](在本例中应该等同于char**)。但是,通过

调用它
linear_search (size_of_A, argv[i])

您只是传递char*作为参数(因为[i]取消引用一个指针)。从我在您的代码中看到的,您可以尝试使用

linear_search (size_of_A, argv+i)

但我不确定这是否会产生预期的行为。还是太早了解C:)

答案 5 :(得分:0)

我不知道你的程序的逻辑,但编译器错误已经解决。 见:

int main(int argc,char * argv []){

int size_of_A = argc - 2;  
int i = 2;  
if (linear_search (size_of_A, argv[])){  
     printf ("%s not found\n", argv [1]);  
     return 1;  
} 

答案 6 :(得分:0)

int linear_search ( int size_of_A, char*argv[]){ 

char*argv[]表示“指向char数组的指针”;作为函数调用参数,与char**相同。

argv char**,但argv[i]char*,因为C将argv[i]定义为*(argv + i )或者,英语“dereference(argv plus i)”。取消引用char**会为您留下char*,并且不是linear_search宣布的内容。

看看here if you're still confused.
`

答案 7 :(得分:0)

你的linear_search()接受一个“字符串数组”(指向字符数组的指针),而你传递一个“字符串”(argv [i])。我想你想做的是将linear_search称为:

if (linear_search (size_of_A, (argv + i)))

虽然我不完全理解你的程序的逻辑......你是否试图在后面的论证中搜索argv [1] ......?

答案 8 :(得分:0)

这似乎是使用表达比较元素之间关系的argv is NULL-terminated. You don't need to pass the count of items in it, but just do like this:

is NULL-terminated. You don't need to pass the count of items in it, but just do like this:

NULL这一事实的好地方。

我意识到使用了!这里很常见,几乎是惯用的,因为很多人认为C必须总是尽可能简洁,但是......我仍然建议反对它。

答案 9 :(得分:0)

oldfart:谨防strcmp和所有无限制的字符串函数(如strcpy - 但要注意strncpy:它不会添加尾随的NULL)。

youngun:但是没关系,因为argv有一堆以NULL结尾的字符串!

of:这种思维方式会导致缓冲区溢出的堆积。使用NULLS初始化argv。但从那以后它可能会发生变化。

y:但这是一个小程序,它永远不会发生。

当然。程序的增长和“永远”发生的次数比你想象的要快。

y:好的,Paranoid先生,我应该用什么尺寸来限制strncmp?没有明显的数字可供使用!你建议我做点什么吗?

请参阅limits.h,特别是ARG_MAX_POSIX_ARG_MAX,了解可能的最大值。如果您愿意,可以使用较小的值。如果您这样做,记录

y:所以我应该写strncmp( arg, target, 5000 )?好的,先生偏执狂。

不要这样做! #define APP_MAX_ARG 5000然后使用strncmp( arg, target, APP_MAX_ARG )。不要让我开始使用魔法数字。这些天孩子们。

嘿,孩子,离开我的草坪