【发布时间】:2015-09-30 16:50:14
【问题描述】:
我刚从here开始学习C语言。
在我上面链接的部分,作者想从一个函数返回一个数组,他写道:
C 不提倡将局部变量的地址返回给 在函数之外,因此您必须定义局部变量 作为静态变量。
我了解阻止返回局部变量地址的原因。原因是局部变量在其范围之外不可用,因此将其地址放在函数之外可能会在运行时产生错误。
但我不明白的部分是为什么我们必须定义数组 Static 而不是 Global?
将本地数组定义为静态只会改变它的生命周期,还是也会改变它的作用域?
这是我说的程序:
#include <stdio.h>
/* function to generate and return random numbers */
int * getRandom( )
{
static int r[10];
int i;
/* set the seed */
srand( (unsigned)time( NULL ) );
for ( i = 0; i < 10; ++i)
{
r[i] = rand();
printf( "r[%d] = %d\n", i, r[i]);
}
return r;
}
/* main function to call above defined function */
int main ()
{
/* a pointer to an int */
int *p;
int i;
p = getRandom();
for ( i = 0; i < 10; i++ )
{
printf( "*(p + %d) : %d\n", i, *(p + i));
}
return 0;
}
更新:
这是上面程序的输出:
r[0] = 313959809
r[1] = 1759055877
r[2] = 1113101911
r[3] = 2133832223
r[4] = 2073354073
r[5] = 167288147
r[6] = 1827471542
r[7] = 834791014
r[8] = 1901409888
r[9] = 1990469526
*(p + 0) : 313959809
*(p + 1) : 1759055877
*(p + 2) : 1113101911
*(p + 3) : 2133832223
*(p + 4) : 2073354073
*(p + 5) : 167288147
*(p + 6) : 1827471542
*(p + 7) : 834791014
*(p + 8) : 1901409888
*(p + 9) : 1990469526
正如您在上面看到的,该数组可以在getRandom() 函数之外访问。这怎么可能?它是一个局部变量!
【问题讨论】:
-
是的,它会改变它的生命周期。
-
数组只能在声明后从
getRandom访问,而对于全局变量,它可以从任何地方访问。静态变量和全局变量的生命周期是相同的。 -
@CoolGuy 该数组只能从
getRandom访问,但它的值也可以从main()获得。我说的对吗? -
@Abraham "数组可以在
getRandom()函数之外访问。这怎么可能?它是一个局部变量!" -- 你返回r(地址静态数组的第一个元素)来自getRandom并使用来自main()的指针p指向该地址。这是完全有效的。 -
@Abraham "多次调用有什么问题?" -- 再次尝试调用
getRandom。您可能会得到相同的“随机”值。