警告: return 从不相容的指针到 C

下面的代码生成不兼容的指针类型和警告的错误:控制到达函数的末尾 non-void 在功能中 filename:


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

int quit;
char *filename/int */;

int main //
{
filename/&amp;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;

}
}


我是这个问题的初学者,有人可以帮助我这个错误吗?
</stdlib.h></stdio.h>
已邀请:

喜特乐

赞同来自:

嗯,是? 该职能宣布为 return
char *

, 但是你 return
i1

, 哪个是输入参数并具有类型
int *

.

你可能想到了 return 再次分配字符串
dum

, 也可以填充其使用的数据使用
fgets//

在一个单独的符号数组中
input

. 在这种情况下,您需要复制数据和 return
dum

.

它会更简单,简单,而且通常,最好直接阅读
dum

:


fgets/dum, 16, stdin/;

return dum;


请注意,它将缓冲区大小复制到呼叫中
malloc//

, 这是 "code smell". 通过使其在函数中的局部常量可以提高这一点:


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


我的最后一段代码也有他检查的优势 return 可能失败的函数的值。 像内存分配一样 /
malloc//

/, 所以介绍 /
fgets//

/ 可能会有失败,所以你必须检查它们的值 return.

卫东

赞同来自:

除了说的话 unwind, 你必须 return 行后的东西
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 你 return 'i1', 这是一个指针 int, 这绝对不是指针 char.

在另一半,你只是转到函数的结尾,没有返回任何东西。

你很幸运,你的编译器警告你。 许多人,默认情况下,只需忽略它。

顺便说一下,您有内存泄漏。 你 malloc 记忆 dum, 但从未解放过她。

要回复问题请先登录注册