错误输出(指针)

问题描述 投票:-1回答:1

我是一名基础程序员。我在一个c程序中写了一个函数返回一个数组(通过一个指针,附带程序的链接)但是有一些错误。输出应为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))
}
c pointers storage-duration
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 )
               ^^^^
{
    //...
}
© www.soinside.com 2019 - 2024. All rights reserved.