【问题标题】:warning:return from incompatible pointer type (enabled by default)警告:从不兼容的指针类型返回(默认启用)
【发布时间】:2013-01-04 17:15:06
【问题描述】:

我编写了一个函数。它得到 1 个字符串和 1 个输入的字符。字符是起点,从该字符开始打印。但我的代码给出了 2 个错误。你能帮帮我吗?

#include <stdio.h>

char * mystrchr(const char * from, char c)
{
    int i;
    for(i=0; from[i]!='\0'; i++)
        if(from[i]==c)

    return (const *)from+i;

return 0;
}

int main()
{
    char *a;

    a=mystrchr("asdfg","d" );

    printf("%s", a);

return 0;
}

注意:其中一个警告不适合标题。因此,我在那里写道:

传递 'mystrchr' 的参数 2 从没有强制转换的指针生成整数 [默认启用]

【问题讨论】:

  • return from incompatible pointer type 是因为 (const *) 转换为 const int*(隐式 int 规则,C89)。

标签: c function pointers constants


【解决方案1】:
#include <stdio.h>

char * mystrchr(const char * from, char c) {
   int i;
   for(i=0; from[i]!='\0'; i++)
      if(from[i]==c)
         return from+i;
   return 0;
}

int main() {
    char *a;
    a=mystrchr("asdfg",'d' );
    printf("%s", a);
    return 0;
}

【讨论】:

  • 为什么要删除 const?
  • 那只是个错误。编辑了原始帖子。
【解决方案2】:

传递 'mystrchr' 的参数 2 从指针生成整数而不进行强制转换

所以你传递了一个指针("d" 的类型是 char [2],当传递给函数时它会衰减为 char *),但函数需要一个 char,它是一个整数类型。

修复:更改

mystrchr("asdfg", "d");

mystrchr("asdfg", 'd');

(注意 'd' 周围的单引号 - 单引号表示 char,而双引号表示字符串文字。)

【讨论】:

    【解决方案3】:

    您可以对第二个参数使用单引号来消除一个警告。 您在单引号中传递 "d" 传递 'd'。 像这样 : mystrchr("asdfg", 'd');

    "d"char* 类型,而您只接受函数定义中的参数为 char,因此会发出警告。

    还将代码return (const *)from+i;更改为return from+i;,此处无需进行类型转换。

    因为achar* 类型,并且您返回const char * 类型并将const char* 分配给char*,所以您收到不兼容的指针类型警告消息

    【讨论】:

      【解决方案4】:

      你的函数是这样声明的

      char *mystrchr(const char *from, char c)
      

      并且旨在将非常量指针返回到 const from 字符串的中间。您不得将 const 数据转换为非常量。所以你应该像这样声明你的函数:

      const char *mystrchr(const char *from, char c)
      

      此时您可以删除 return 语句中的强制转换。

      return from+i;
      

      如果使用指针进行迭代,该函数可以说会更简单:

      const char *mystrchr(const char *from, const char c)
      {
          for (const char *p = from; *p; p++)
              if (*p == c)
                  return p;
          return 0;
      }
      

      另一个问题是文字"d" 是一个以null 结尾的C 字符串文字,而不是char。您需要使用 'd' 来指定 char 文字。

      【讨论】:

      • @user1946383 你应该选择你认为最好的答案并接受它。
      猜你喜欢
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      相关资源
      最近更新 更多