Массивы разлагаются или неявно преобразуются в указатели при передаче функции в качестве аргумента или при преобразовании в r-значение в правой части оператора присваивания.Так что-то вроде:
int array[10];
int* a = array; //implicit conversion to pointer to type int
void function(int* a);
function(array); //implicit conversion to pointer to type int
работает просто отлично.Но это не означает , что сами массивы являются указателями.Поэтому, если вы рассматриваете массив как указатель, как вы это делали, вы фактически обрабатываете тип массива так, как если бы он был указателем, который содержал адрес для объекта int
.Поскольку ваш массив на самом деле представляет собой последовательность int
объектов, а не указателей на int
объектов, вы фактически пытаетесь разыменовать какую-то область памяти, которая не указывает ни на что действительное (т. Е. Первый слот в array
- это числовое целочисленное значение, например 0
, которое будет похоже на разыменование NULL).Так вот почему ты сегфолтинг.Обратите внимание, что если вы сделали что-то вроде этого:
int array[] = { 1, 2, 3, 4, 5};
int b = *array;
Это все еще работает, поскольку array
снова неявно преобразуется в указатель на блок памяти, который содержит последовательность целочисленных значений и затем разыменовываетсячтобы получить значение в первой последовательности.Но в вашем случае, объявив ваш массив текущему модулю кода как внешний указатель, а не как массив, он пропустит неявное преобразование в указатель, который обычно выполняется, и просто использует объект массива, как если бы онбыли указателем на сам объект, а не на массив объектов.