C错误我之前没遇到过

时间:2014-08-15 14:23:37

标签: c variables pointers integer

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搜索,但没有成功

3 个答案:

答案 0 :(得分:8)

您已将您的功能声明为

shell_command(char gcommand[100])

由编译器解释为

int shell_command(char gcommand[100])

虽然你希望它是

char* shell_command(char gcommand[100])

这是行不通的,因为输出是一个堆栈变量,并且返回的是未定义的行为,正如编译器告诉你的那样。

答案 1 :(得分:3)

  1. 您没有指定函数的返回类型,因此编译器假定它返回int,但您尝试返回char *。请注意,预标准C和C89允许此“隐式返回类型”。 C99及更高版本需要返回类型。由于预标准遗留代码,编译器仍允许代码通过。

  2. 您正在尝试返回本地变量output,但该函数返回时该变量将消失。 (如果popen()失败,您还会返回指向未初始化变量的指针。并忽略传递给函数的gcommand参数。)

  3. 您应该将缓冲区及其大小传递给函数:

    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 *