Вывод ошибки (указатель)

Я программист базового уровня. Я написал функцию в программе 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))
}

1 ответ

Внутри функции 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 )
               ^^^^
{
    //...
}
Другие вопросы по тегам