【问题标题】:C error I've not encountered before我以前没有遇到过的C错误
【发布时间】:2014-10-09 07:01:56
【问题描述】:
shell_command(char gcommand[100]) {
FILE *pipe = popen("ls", "r");
char output[100];
if ( pipe ) {
fgets(output, sizeof output, pipe);
pclose(pipe);
}
return output;
}
结果
program.c:在函数“shell_command”中:
program.c:42:警告:返回
从没有强制转换的指针生成整数
program.c:42: 警告:
函数返回局部变量的地址
我用谷歌搜索了两天没有成功
【问题讨论】:
-
你的函数没有返回值,显然默认为int,就像在 C99 之前一样。因此第一个警告。隐式-int 之前应该发出警告。对于第二个警告:参见例如here 或 here。至少对于第二个警告,我通过搜索消息得到了一堆答案。
标签:
c
variables
pointers
integer
【解决方案1】:
你已经将你的函数声明为
shell_command(char gcommand[100])
编译器将其解释为
int shell_command(char gcommand[100])
在你想要的时候
char* shell_command(char gcommand[100])
这是行不通的,因为输出是一个堆栈变量,返回的是未定义的行为,正如编译器告诉你的那样。
【解决方案2】:
你没有指定函数的返回类型,所以编译器假定它返回一个int,但你试图返回一个char *。请注意,准标准 C 和 C89 允许这种“隐式返回类型”。 C99 及更高版本需要返回类型。由于预标准遗留代码,编译器仍然允许代码通过。
您试图返回局部变量output,但是当函数返回时该变量消失了。 (如果popen() 失败,您还会返回一个指向未初始化变量的指针。并且忽略传递给函数的gcommand 参数。)
您可能应该将缓冲区及其大小传递给函数:
int shell_command(const char *gcommand, char *buffer, size_t buflen)
{
FILE *pipe = popen(gcommand, "r");
if (pipe)
{
char *result = fgets(buffer, buflen, pipe);
pclose(pipe);
if (result != 0)
return 0;
}
return -1;
}
这会在成功时返回 0,在失败时返回 -1,并且(现在)检查来自 fgets() 的返回值,这可能会失败,但确保管道无论如何都会关闭。
【解决方案3】:
返回 char* 的另一种方法。您正在返回一个局部指针变量。而是使用 strcpy() 传递一个字符数组并将输出变量复制到该数组中
另一种方法是返回字符数组,函数返回类型为char*