2012-10-18 62 views
1

在下面的代码生成兼容的指针类型错误和警告:控制到达在文件名函数非void函数的结束:警告:从兼容的指针类型用C返回

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

    } 
} 

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

+0

您的'main'函数在不使用返回值的情况下调用'filename',为什么函数需要返回任何东西? – Barmar

+0

其实,问题应该是:为什么'main'不使用返回值?你打印“记得要自由”,但是永远不要释放它。 – Barmar

回答

3

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

+0

非常感谢你,就像我说的,我是新来的,你的评论帮了很多忙:) –

1

除了放松什么说你应该行printf("Memory could not be allocated \n");

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; 

    } 
} 

所以在如果你返回“I1”,这是一个int指针,这绝对不是一个字符指针的一条路径。

在另一半,你只是直到功能的结束,它不返回任何东西。

你很幸运,你的编译器警告你这件事。很多,默认情况下,忽略它。另外,你有内存泄漏。你的dum的malloc内存,但从来没有释放它。

相关问题