Почему следующее приводит к ошибке сегментации?

#c #pointers

Вопрос:

 const int* additional(int* s, int* f){
    const int* ts = reinterpret_cast<const int*>(*s   *f);
    return ts;
}
int main() {
    int a = 10, b = 20;
    const int* oc = additional(amp;a, amp;b);
    std::cout << *oc;
    return 0;
}
 

Я пробовал использовать статику, хотя это приводит к той же ошибке

Комментарии:

1. *s *f это int, а не указатель. s и f не существуют, как только функция возвращает либо.

Ответ №1:

В вашем коде много чего не так.
*s *f является int, а не указателем (вы добавляете разыменованные значения).
вы делаете reinterpret cast то, что совсем не нужно. Просто передайте int напрямую, без указателей, и все готово.

 const int additional(int s, int f){
    return s   f;
}
int main() {
    int a = 10, b = 20;
    const int oc = additional(a, b);
    std::cout << oc;
    return 0;
}
 

Ответ №2:

Вы переосмысливаете число 30 как указатель на const int и пытаетесь прочитать переосмысленный указатель. Операционная система заметила, что процесс пытается получить доступ к адресу, который не был сопоставлен для процесса, и отправила сигнал segfault для завершения процесса, чтобы защитить плохо работающий процесс от самого себя.

Переосмысление небезопасно. Не используйте его, если вы не знаете, что делаете. И когда вы поймете, что делаете, вы поймете, что необходимость в его использовании возникает довольно редко.

Я стремился сократить int t = *f *s ;

Это уже очень мало. Функция, которую вы определили, намного длиннее, и поэтому это даже вызов функции. Обратите внимание, что выражение инициализатора, которое вы цитируете, имеет тип int , в то время как ваша функция возвращает const int* . Это, наряду со сломанной переосмыслением, является проблемой.

Если вы хотите сократить косвенное указание, то как насчет использования ссылок вместо указателей:

 const intamp; f = a;
const intamp; s = b;
int t = a   b; // shorter
 

Комментарии:

1. Я был полностью осведомлен и намеренно разыменовал параметры в попытке сделать так, чтобы локально созданный указатель указывал на умножение разыменованных значений, тем самым делая его доступным для main. Как бы претенциозно это ни звучало, я стремился сократить int t = *f *s; . Итак, теперь вопрос в том, возможно ли на самом деле реализовать это, так сказать, «сокращение»? Да, я новенькая.