2016-10-30 6 views
0

Когда функция get_poly запущена, она дает мне ошибку сегментации. Некоторые из заполнителей и прочее были попыткой исправить ошибку. Я действительно не знаю, что вызывает это.Ошибка сегментации при использовании указателя на массив

//Weston Sapusek, cop3515 
//This program outputs the polynomial of a number given coefficients for each exponent. 

#include <stdio.h> 
#include <math.h> 

void get_poly(double *coeff, int N); 
void eval_poly(double *coeff, double base, int N); 

int main(void) 
{ 
    int N; //max exponent 
    double base; 

    printf("Please enter the power of your polynomial: "); 
    scanf("%d", &N); 

    printf("Please enter the base number: "); 
    scanf("%lf", &base); 

    double a[N]; 
    double *coeff; 
    coeff = &a[0]; 

    get_poly(coeff, N); 
    coeff = 0; //reset the coefficient pointer 

    eval_poly(coeff, base, N); 
    return 0; 
} 

void get_poly(double *coeff, int N) { 
    printf("Enter %d coeffecients of the function, in order: ", N); 
    int i = 0; 
    double placeholder; 
    for (i = 0; i < N; i++){ 
     scanf("%lf", &placeholder); 
     *coeff = placeholder; 
     coeff++; 
    } 
} 

void eval_poly(double *coeff, double base, int N) 
{ 
    int i = 0; 
    double x = 0; //total 

    for (i = 0; i < N; i++){ 
     x+= *coeff * base; 
    } 
    printf("%lf", x); 
} 
+0

Составляет ли он? double a [N]; здесь N должно быть постоянным – Asesh

+2

Правильным инструментом для решения таких проблем является ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

@Asesh: переменная длина массива, сомнительная функция C99, которую по умолчанию можно использовать как расширение в C++ с помощью GCC. –

ответ

0

Это выглядит проблематичной код:

get_poly(coeff, N); 
coeff = 0; //reset the coeffecient pointer 

eval_poly(coeff, base, N); 

Вы сбросить указатель coeffecient, после этого coeff является NULL. Затем вы вызываете eval_poly и де-ссылку, что будет указателем NULL coeff внутри eval_poly функция. Это вызвало segfault.

0

просто удалить эту строку:

coeff = 0; //reset the coeffecient pointer 

coeff не изменяется get_poly, потому что он послал по значению (хотя это указатель)

Установка coeff = 0; позволяет указать на недопустимый адрес памяти.

Смежные вопросы