以下代码生成不兼容的指针类型错误和警告:控件到达文件名函数中的非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;
}
}
我是新手,有人可以帮我解决这个错误吗?
答案 0 :(得分: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()
)都可能失败,因此您必须检查它们的返回值。
答案 1 :(得分:1)
除了unwind所说的,你应该在行printf("Memory could not be allocated \n");
答案 2 :(得分: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购买malloc内存,但永远不要释放它。