在函数内pointer
,数组A
是函数的本地对象,退出函数后将不再存在。该数组占用的内存可以被程序中创建的其他对象覆盖。
因此,使用函数的自动存储持续时间返回指向本地对象的指针会导致未定义的行为。
您可以通过以下方式使程序有效
#include <stdio.h>
int * pointer( int a[] )
{
a[0] = 1;
a[1] = 2;
return a;
}
#define N 10
int main(void)
{
int a[N];
int *p = pointer( a );
printf( "%d\n", *p );
printf( "%d\n", *( p + 1 ) );
return 0;
}
程序输出为
1
2
另一种方法是在函数内声明一个本地数组,但具有静态存储持续时间。
例如
#include <stdio.h>
#define N 10
int * pointer( void )
{
static int a[N];
a[0] = 1;
a[1] = 2;
return a;
}
int main(void)
{
int *p = pointer();
printf( "%d\n", *p );
printf( "%d\n", *( p + 1 ) );
return 0;
}
在这种情况下,即使退出函数,数组也将是活动的。
考虑到根据 C 标准,main
没有参数的函数应声明为
int main( void )
^^^^
pointer
也应该声明没有参数的函数(当它被定义时)
int * pointer( void )
^^^^
{
//...
}