3

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

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

    }
}

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

4

3 回答 3

3

嗯,是?该函数被声明为 return char *,但您返回i1的是输入参数并具有 type 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()) 都可能失败,因此您必须检查它们的返回值。

于 2012-10-18T06:53:04.417 回答
1

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

于 2012-10-18T06:55:40.637 回答
1

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

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 分配内存,但从不释放它。

于 2012-10-18T06:57:50.637 回答