为什么一个int return类型的函数可以return一个字符串?

Why can an int return type function return a string?

这就是我要说的功能:

static int getInput()
{
    printf("Enter your name: ");
    return fgets(input, sizeof(input), stdin) != NULL;
}

这是如何工作的?为什么一个int return 类型可以这样使用fgets?

fgets(...) != NULL

计算结果为布尔值,布尔值在 C 中表示为整数。

您的函数将 return true == 1false == 0
这不应该return一个字符串

实际上 OPs 函数没有 return char * 指针但是可以这样做

int foo(char *c)
{
    return (int)c;
}

它将return char指针转换为int。如果 int 足够大以容纳指针,则可以将其转换回指针。

https://godbolt.org/z/z_xsc7

这种转换在微控制器和非常底层的硬件相关编程中非常常见(当可移植性无关紧要时)。使用无符号整数(通常固定大小,如 uint64_t 以确保它们足够大)来获取、传递和存储地址

"Why can an int return type function return a string?"

事实上,它不能。

让我们仔细看看这个声明:

return fgets(input, sizeof(input), stdin) != NULL;

fgets() returns 指向 char 的指针。检查此指针是否为空指针。如果返回的指针是非空指针(fgets() 实际上返回指向 input 的指针),则此布尔表达式的验证结果为 1,如果是 0空指针 - 表示在使用 fgets().

消耗输入时发生错误

这个int值(01)然后从函数getInput()返回;不是指针,甚至不是按值本身的字符串(这对于 C 语法来说是不可能的)。


旁注:

  1. input 似乎是一个全局的 char 数组。避免全局数组。它会使您和读者感到困惑。通过引用传递指向缓冲区的指针,并改为通过值传递缓冲区的大小。

    static char* getInput (char* buf, size_t len)
    {
        if ( len > INT_MAX || len < 2 )
        {
            return NULL;
        }
    
        printf("Enter your name: ");
        return fgets(buf, len, stdin);
    }
    

    并这样称呼它:

    char a[20];
    if ( getInput(a, sizeof(a)) == NULL )
    {
        fputs("Error occured at consuming input!", stderr);
    }
    
  2. 本例中static限定符的含义,看一下:

    What is a "static" function in C?