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

时间:2010-08-18 01:43:57

标签: c pointers char

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

int x = 1;
return x;

char x[] = "hello";
return x;

4 个答案:

答案 0 :(得分:8)

原因既简单又微妙: C函数无法声明返回数组。

返回指针时,如下所示:

char *foo(void)
{
    char x[] = "hello";
    return x;
}

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

return &x[0];

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

int *foo(void)
{
    int x = 100;
    return &x;
}

然而,可以从函数返回结构 - 因此只要它包含在struct内,就可以返回一个数组。以下是相当不错的:

struct xyzzy {
    char x[10];
};

struct xyzzy foo(void)
{
    struct xyzzy x = { "hello" };
    return x;
}

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

答案 1 :(得分:3)

整数是基本类型,因此返回它的值。但是,在C中,字符串是基本类型,这就是您将其声明为字符数组的原因。当你返回一个数组时,你实际上是在返回一个指向原始数组的指针,所以它是一种返回引用,如果你愿意的话。但正如您所看到的,退出函数后指向char x[]的指针无效。

答案 2 :(得分:2)

请参阅我撰写的关于this的详细答案。不仅如此,在C中,在函数范围内创建的变量使用自动堆栈堆,变量将驻留在其中,当函数返回时,该堆被销毁,这是局部变量的使用,尤其是类型字符串即char []或指向字符串的指针必须在函数作用域外的堆上分配,否则将返回垃圾。解决方法是使用静态缓冲区或使用malloc

答案 3 :(得分:1)

该char数组是在函数范围内分配的(而不是像malloc()那样动态分配),因此它在该范围之外是不可用的。

围绕它的两种方式:

  1. 声明char数组为static
  2. 在调用函数中分配缓冲区,将其作为参数传递,然后此函数填充它。
相关问题