Вылет программы C++(Segmentation fault)

243
22 сентября 2017, 20:12

После появления запроса на ввод чисел программа вылет с такой ошибкой:
Segmentation fault (core dumped)

#include "iostream"
using namespace std;
long double raf(int a , ...)
{
    int *p = &a;
    int b = 0;
    for(; a != 0; a++)
    {
        b+= *(++p);
    }
    int c = b/a;
    return c;
}
int main()
{
    cout << "Midle count of numbers 5,3,9,1,7: " << endl;
    raf(5,5,3,9,1,7);
    return 0;
}
Answer 1

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

#include <iostream>
using namespace std;
long double raf(int a , ...)
{
    int *p = &a;
    int cnt = a;
    int b = 0;
    for(; cnt != 0; --cnt)
    {
        b+= *(++p);
    }
    return ((long double)b)/a;
}
int main()
{
    cout << "Midle count of numbers 5,3,9,1,7: " << endl;
    cout << raf(5,5,3,9,1,7) << endl;
    return 0;
}

Посмотрите у себя - цикл ставите бесконечный (пока растущее a не станет нулем, потом делите на него - нулевое... Делите целочисленно, а надеетесь получить long double... Наконец, просто не выводите полученный результат. Об английском языке промолчу :)

Стандартное же решение такое:

#include <iostream>
#include <cstdarg>
using namespace std;
long double raf(int a , ...)
{
    va_list p;
    va_start(p,a);
    int cnt = a;
    int b = 0;
    for(; cnt != 0; --cnt)
    {
        b+= va_arg(p,int);
    }
    va_end(p);
    return ((long double)b)/a;
}
int main()
{
    cout << "Midle count of numbers 5,3,9,1,7: " << endl;
    cout << raf(5,5,3,9,1,7) << endl;
    return 0;
}
Answer 2

Доступ к variadic аргументам функций (параметры ...) в С и С++ делается только через va_list и макросы va_start/va_arg/va_end. Других способов не существует.

Поэтому ни о каком int *p = &a; и прочей вашей "адресной арифметике" не может быть и речи. Это какая-то белиберда, непонятно откуда вами выкопанная. Неудивительно, что дело заканчивается Segmentation fault.

READ ALSO
Запуск exe с флеш носителя

Запуск exe с флеш носителя

Добрый день! У меня такая проблема компилирую exe, который необходимо запустить с флеш носителя на другом PCПри запуске, АВ Avast пропускает исполняемый...

247
Заменить все символы на пробелы

Заменить все символы на пробелы

Я считываю строку, состоящую из чисел, разделенных различными символами, как удалить из строки все символы, заменив их на пробелы(хочу посчитать...

324
Алгоритм суммы произведений

Алгоритм суммы произведений

Привет! Помогите пожалуйста с создать алгоритм для суммы произведенийДолжен быть цикл в цикле, первый сделал (произведение), а как теперь...

208
Как работает функция getsockname()?

Как работает функция getsockname()?

Я создаю сокет, привязываю его к порту 33005Далее хочу узнать к какому порту привязан сокет, но почему-то sockaddr_in

307