Ошибка сегментации при распределении памяти [дубликат]

Отсутствует «extern» в объявлениях / определениях переменной 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

3
задан eatonphil 20 August 2013 в 16:30
поделиться

2 ответа

Причина, по которой вы получаете неопределенное поведение, заключается в том, что индексный оператор [] имеет приоритет над оператором косвенности *. Значение extrema индексируется как массив указателей, что неверно, потому что там есть только один указатель.

Поскольку вы передаете указатель на указатель, вам нужно поместить звездочку внутрь круглые скобки:

if (quadrant == 1)
{
    (*extrema)[0] = 0;
    (*extrema)[1] = 90;
}
else if (quadrant == 2)
{
    (*extrema)[0] = -90;
    (*extrema)[1] = 0;
}

Демонстрация на идеоне.

8
ответ дан dasblinkenlight 25 August 2018 в 12:34
поделиться

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);
}
1
ответ дан Antti Haapala 25 August 2018 в 12:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: