Тип int[]
на самом деле не существует.
Когда вы определяете и инициализируете массив, например
int a[] = {1,2,3};
, компилятор считает элементы в инициализаторе и создает массивправильный размер;в этом случае оно волшебным образом становится:
int a[3] = {1,2,3};
int[]
, используемым в качестве параметра функции, вместо этого это просто int *
, то есть указатель на первый элемент массива.Никакой другой информации не содержится, в частности, ничего о размере не сохраняется.То же самое сохраняется, когда вы возвращаете указатель
Обратите внимание, что массив не является указателем: указатель можно изменить, чтобы он указывал на другие объекты, в то время как массив всегда ссылается на одну и ту же память;указатель ничего не знает о том, насколько велик объем памяти, на который он указывает, а размер массива всегда известен во время компиляции.Путаница возникает из-за того, что массив распадается на указатель на его первый элемент во многих обстоятельствах, и передача его функции / возвращение из функции - вот некоторые из этих обстоятельств.
Так почему же ваш код не работает?Есть две большие ошибки:
Вы пытаетесь инициализировать массив указателем.Мы сказали, что int *
не несет никакой информации о размере массива.Это просто указатель на первый элемент.Таким образом, компилятор не может знать, какой большой a
должен быть сделан для размещения материала, возвращаемого f()
.
В f
вы возвращаете указатель на локальную переменнуюк этой функции.Это неправильно, потому что указатель на самом деле не хранит данные, он только указывает , где хранятся данные, то есть, в вашем случае, a
локально по f
.Поскольку этот массив является локальным для функции, он перестает существовать при выходе из функции (т. Е. В return
).
Это означает, что указатель, который вы возвращаете, указывает на вещи, которыебольше не существует;рассмотрим код:
int * a = f();
Эта инициализация работает, и вы можете попытаться использовать a
позже в функции, но a
будет указывать на более не существующий массив f
;в лучшем случае ваша программа зависнет (и вы сразу заметите, что сделали что-то не так), в худшем случае она будет работать некоторое время, а затем начнет давать странные результаты.