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:warning:return 在没有强制转换的情况下从指针生成整数.c:42:警告: 函数返回局部变量的地址
我在两天内用Google搜索,但没有成功
答案 0 :(得分:8)
您已将您的功能声明为
shell_command(char gcommand[100])
由编译器解释为
int shell_command(char gcommand[100])
虽然你希望它是
char* shell_command(char gcommand[100])
这是行不通的,因为输出是一个堆栈变量,并且返回的是未定义的行为,正如编译器告诉你的那样。
答案 1 :(得分:3)
您没有指定函数的返回类型,因此编译器假定它返回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()
的返回值,这可能会失败,但确保管道关闭,无论如何。
答案 2 :(得分:0)
除了返回char *之外的另一种方式。您正在返回本地指针变量。而是使用strcpy()传递一个字符数组并将输出变量复制到该数组中 另一种方法是返回字符数组,返回类型的函数是char *