在C函数中返回字符串,需要解释

sni*_*tko 2 c pointers char

据我所知,为了从函数返回一个字符串,我必须返回一个指针.我不明白的是为什么char数组被处理与整数有些不同,并且在退出函数时会被销毁.这可能是因为我来自一个高级语言世界,但这对我来说似乎同样有效:

int x = 1;
return x;

char x[] = "hello";
return x;
Run Code Online (Sandbox Code Playgroud)

caf*_*caf 8

原因既简单又微妙:C函数不能声明为返回数组.

当你返回一个指针时,如下所示:

char *foo(void)
{
    char x[] = "hello";
    return x;
}
Run Code Online (Sandbox Code Playgroud)

return x;实际的返回x.它返回一个指向第一个元素x1的指针- 它与说法完全相同:

return &x[0];
Run Code Online (Sandbox Code Playgroud)

应该更清楚为什么这不正确 - 这与此完全相同:

int *foo(void)
{
    int x = 100;
    return &x;
}
Run Code Online (Sandbox Code Playgroud)

但是,可以从函数返回结构 - 所以只要它包含在一个数组中就可以返回一个数组struct.以下是相当不错的:

struct xyzzy {
    char x[10];
};

struct xyzzy foo(void)
{
    struct xyzzy x = { "hello" };
    return x;
}
Run Code Online (Sandbox Code Playgroud)


这是数组类型的特殊情况规则的结果.在表达式中,如果数组不是一元&sizeof运算符的主题,则它将计算指向其第一个元素的指针.试图在C中确定一个实际的阵列有点像试图抓住你手中的雾 - 它只是消失了,取而代之的是一个指针.

  • @Ivo Wetzel:不,数组与指针不同*.这是一种常见但不正确的理解.特别是,`char*x ="hello";`声明`x`作为指针,而`char x [] ="hello";`声明`x`作为6个字符的数组(尝试打印`sizeof x`在这两种情况下!). (3认同)