Вывод ошибки (указатель)
Я программист базового уровня. Я написал функцию в программе 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 )
^^^^
{
//...
}