警告:从 C 中不兼容的指针类型返回

Posted

技术标签:

【中文标题】警告:从 C 中不兼容的指针类型返回【英文标题】:Warning: return from incompatible pointer type in C 【发布时间】:2012-10-08 13:26:13 【问题描述】:

以下代码生成不兼容的指针类型错误和警告:控制到达文件名函数中非空函数的结尾:

#include <stdio.h>
#include <stdlib.h>    

int quit;
char *filename(int *);

int main ()
   
    filename(&quit);   
    return 0;


char *filename(int *i1)

    char input[16];
    char *dum=(char*)malloc(16*sizeof(char));    
    if (dum==NULL)
        printf("Memory could not be allocated \n");
    
    else 
        printf("Memory was allocated – remember to free\n \n");    
        *i1=1;    
        fputs("Input filename = ", stdout);
        fflush(stdout);
        fgets(input,sizeof(input),stdin);    
        printf("Filename = \"%s\"\n",input);   
        return i1;

    

我是新手,有人可以帮我解决这个错误吗?

【问题讨论】:

你的main函数调用filename没有使用返回值,那么为什么函数需要返回任何东西呢? 其实问题应该是:为什么main不使用返回值呢?你打印“记得释放”,但永远不要释放它。 【参考方案1】:

嗯,是吗?该函数声明为返回char *,但您返回i1,它是输入参数,类型为int *

您可能想要返回新分配的字符串dum,也可能还需要将使用fgets() 读取的数据填充到单独的字符数组input 中。在这种情况下,您需要将数据复制过来,并返回dum

直接读入dum会更简洁,更简单,通常更好:

fgets(dum, 16, stdin);

return dum;

请注意,这复制了来自malloc() 调用的缓冲区大小,这是一种“代码异味”。这可以通过使其成为函数中的局部常量来改进:

char * filename(void)

  const size_t max_fn = 16;
  char *dum;

  if((dum = malloc(max_fn)) != NULL)
  
    if(fgets(dum, max_fn, stdin) != dum)
    
      free(dum);  /* Input failed, free the buffer and drop the pointer. */
      dum = NULL;
    
  
  return dum;

我后面的代码还具有检查可能失败的函数的返回值的好处。内存分配 (malloc()) 和 I/O (fgets()) 都可能失败,因此您必须检查它们的返回值。

【讨论】:

非常感谢,就像我说的,我是新手,您的评论帮助很大:)【参考方案2】:

除了 unwind 所说的你应该在 printf("Memory could not be allocated \n"); 行之后返回一些东西

【讨论】:

【参考方案3】:

嗯,首先,你的缩进令人震惊。重新缩进这可以更清楚地说明发生了什么:

char *filename(int *i1)

    char input[16];
    char *dum=(char*)malloc(16*sizeof(char));

    if (dum==NULL)
        printf("Memory could not be allocated \n");
    
    else 
        printf("Memory was allocated – remember to free\n \n");

        *i1=1;

        fputs("Input filename = ", stdout);
        fflush(stdout);
        fgets(input,sizeof(input),stdin);

        printf("Filename = \"%s\"\n",input);

        return i1;

    

因此,在 if 的一个路径中,您返回 'i1',它是一个 int 指针,绝对不是 char 指针。

在另一半中,你只是直接跳到函数的末尾,它什么也不返回。

您很幸运,您的编译器会就此发出警告。很多,默认情况下,忽略它。

顺便说一句,您有内存泄漏。你为 dum 分配内存,但从不释放它。

【讨论】:

以上是关于警告:从 C 中不兼容的指针类型返回的主要内容,如果未能解决你的问题,请参考以下文章

得到错误而不是不兼容的指针类型警告

收到有关不兼容指针类型的警告

自定义 UITableViewCell 的不兼容指针类型警告

iOS - AFNetworking GET 方法中不兼容的块指针类型

qsort 的第四个参数的“不兼容的指针类型”编译器警告

在 iOS 7 之前的项目中编译警告“不兼容的指针类型初始化 'UIImage *' 使用类型为'CIImage * _Nullable”的表达式