据我所知,为了从函数返回一个字符串,我必须返回一个指针。我不明白的是为什么char数组被处理与整数有些不同,并且在退出函数时会被销毁。这可能是因为我来自一个高级语言世界,但这对我来说似乎同样有效:
int x = 1;
return x;
char x[] = "hello";
return x;
答案 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()那样动态分配),因此它在该范围之外是不可用的。
围绕它的两种方式:
static