const
(только для C ++) Для людей, прибывающих с C, может показаться неожиданным, что в C ++ глобальные переменные const
имеют внутренние (или статические) связь. В C это не так, поскольку все глобальные переменные неявно extern
(т.е. когда отсутствует ключевое слово static
).
Пример:
// file1.cpp
const int test = 5; // in C++ same as "static const int test = 5"
int test2 = 5;
// file2.cpp
extern const int test;
extern int test2;
void foo()
{
int x = test; // linker error in C++ , no error in C
int y = test2; // no problem
}
correct would использовать файл заголовка и включить его в file2.cpp и file1.cpp
extern const int test;
extern int test2;
. В качестве альтернативы можно было бы объявить переменную const
в файле file1.cpp с явным extern
Причина, по которой вы получаете неопределенное поведение, заключается в том, что индексный оператор []
имеет приоритет над оператором косвенности *
. Значение extrema
индексируется как массив указателей, что неверно, потому что там есть только один указатель.
Поскольку вы передаете указатель на указатель, вам нужно поместить звездочку внутрь круглые скобки:
if (quadrant == 1)
{
(*extrema)[0] = 0;
(*extrema)[1] = 90;
}
else if (quadrant == 2)
{
(*extrema)[0] = -90;
(*extrema)[1] = 0;
}
a[b]
равно *(a + b)
, но имеет более высокий приоритет, чем *
. (И как a + b
есть b + a
, так a[b]
равно b[a]
, а 5[a]
равно a[5]
).
Таким образом:
*(extrema)[1] = 90;
// is equal to
*(*(extrema + 1)) = 99;
// When what you want to do is
*((*extrema) + 1) = 99;
// which is of course equal to
(*extrema)[1] = 99;
Однако, еще лучший вопрос: почему вы используете двойной указатель, когда он не нужен.
void get_extrema(int quadrant, int *extrema)
{
if (quadrant == 1)
{
extrema[0] = 0;
extrema[1] = 90;
}
else if (quadrant == 2)
{
extrema[0] = -90;
extrema[1] = 0;
}
}
void print(int *arr)
{
printf("%i,%i\n", arr[0], arr[1]);
}
int main(void)
{
int *extrema = (int *)malloc(2 * sizeof (int));
get_extrema(1, extrema);
print(extrema);
get_extrema(2, extrema);
print(extrema);
}