【问题标题】: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 之前应该发出警告。对于第二个警告:参见例如herehere。至少对于第二个警告,我通过搜索消息得到了一堆答案。

标签: c variables pointers integer


【解决方案1】:

你已经将你的函数声明为

shell_command(char gcommand[100])

编译器将其解释为

int shell_command(char gcommand[100])

在你想要的时候

char* shell_command(char gcommand[100])

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

【讨论】:

    【解决方案2】:
    1. 你没有指定函数的返回类型,所以编译器假定它返回一个int,但你试图返回一个char *。请注意,准标准 C 和 C89 允许这种“隐式返回类型”。 C99 及更高版本需要返回类型。由于预标准遗留代码,编译器仍然允许代码通过。

    2. 您试图返回局部变量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*

      【讨论】:

      • 修改了另一种解决方案。
      猜你喜欢
      • 2023-02-23
      • 2015-10-15
      • 1970-01-01
      • 2012-08-24
      • 2012-09-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多