-1

我是一个初级程序员。我在 ac 程序中编写了一个函数,返回一个数组(通过一个指针,附加的程序链接)但是有一些错误。输出应该是 12,但输出是 10。

有人可以帮我找出错误(如果有概念错误)

#include<stdio.h>
int *pointer()
{
    int A[10];
    A[0] = 1;
    A[1] = 2;
    return A;
}

int main()
{
    int *p;
    p = pointer();
    printf("%d", *p);
    printf("%d", *(p+1))
}
4

1 回答 1

2

在函数内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 )
               ^^^^
{
    //...
}
于 2017-12-20T13:59:34.123 回答