繁体   English   中英

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

[英]Warning: return from incompatible pointer type in C

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

#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;

    }
}

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

嗯,是? 该函数声明为返回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() )都可能失败,因此您必须检查它们的返回值。

除了unwind所说的以外,您还应该在printf("Memory could not be allocated \\n");行之后返回一些内容printf("Memory could not be allocated \\n");

好吧,首先,您的缩进令人震惊。 重新缩进后,可以更清楚地了解发生了什么:

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指针。

在另一半中,您只需进入函数的末尾,该函数将不返回任何内容。

您很幸运,编译器对此发出警告。 很多情况下,默认情况下,只需忽略它即可。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM