Ошибка сегментации при » прямой передаче()»

#c #segmentation-fault #gdb

Вопрос:

Я работаю над созданием простой модели восприятия на языке Си, и я решил, что хочу иметь какую-то абстракцию, использующую непрозрачные указатели. Приведенный ниже код может дать больше подсказок к проблеме

персептрон.h

 
#ifndef __PERCEPTRON_H__
#define __PERCEPTRON_H__

typedef struct _Perceptron _perceptron;

typedef struct{

//public
    float * input;
    float * weigths;
    int size;
//private 
    void * m_perceptron;

}Perceptron;

Perceptron * InitPerceptron();
void FreePerceptron(Perceptron * instance);
void FeedForward(float input[],float weights[],int size,Perceptron * perceptron);

#endif
 

и это мое восприятие.c

 typedef struct _Perceptron{

    float * input;
    int size;

}_perceptron;

static void _FeedForward(float input[],float weights[],int size,_perceptron * p){

    if(p->input == NULL)
        p->input = (float *)calloc(size,sizeof(float));
    
    for(int i = 0;i < size;i  )
        p->input[i] = input[i] * weights[i];

    for(int i = 0;i < size;i  )
        printf("%f ",p->input[i]);

}

Perceptron * InitPerceptron(){

    Perceptron * instance = (Perceptron *)malloc(sizeof(Perceptron));
    instance ->m_perceptron = (_perceptron *)malloc(sizeof(_perceptron));
    
    return instance;

}

void FeedForward(float input[],float weights[],int size,Perceptron * perceptron) {

    if(perceptron->input == NULL)
        perceptron->input = (float *)malloc(size*sizeof(float));
    
    if(perceptron->weigths == NULL)
        perceptron->weigths = (float *)malloc(size*sizeof(float));

    for(int i = 0;i < size;i  ){
        perceptron->input[i] = input[i];
        perceptron->weigths[i] = weights[i];
    }

    perceptron->size = size;

    _FeedForward(perceptron->input,perceptron->weigths,perceptron->size,perceptron->m_perceptron);

}


void FreePerceptron(Perceptron * instance){

    free(instance->m_perceptron);
    free(instance);

}
 

и это мое главное.c

     float input[] = {1,2,3};
    float weights[] = {1,1,1};

    Perceptron * perceptron = InitPerceptron();
    FeedForward(input,weights,3,perceptron);
    FreePerceptron(perceptron);

    return 0;

 
 (gdb) r
Starting program: E:reposNeuralNetworkbinneuralnetwork.exe
[New Thread 14564.0x49c4]
[New Thread 14564.0x3a44]

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00000000004017b4 in FeedForward ()
(gdb)
 

Это ошибка, которую я получаю

Мое первоначальное предположение состоит в том, что, возможно, я обращаюсь к указателям восприятия и _perceptron как к нулевым указателям, поэтому я попытался удалить функцию прямой передачи, и, похоже, она работает просто отлично. Мое следующее предположение состоит в том, что входные данные, вероятно, даны неверно, но это кажется маловероятным.Что может быть причиной ошибки сегментации. Может ли это быть в самой основной функции, связано ли это с использованием malloc для указателей с плавающей точкой или использование моих непрозрачных указателей неправильно ?

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

1. Это вопрос на C ?

2. GDB скажет вам, что не так, не нужно гадать. Я бы предложил также использовать дезинфицирующие средства, они могут обнаружить эти ошибки — память,адрес,неопределенность,утечка и поток. Может быть включен с -fsanitize помощью флага в GCC и Clang

Ответ №1:

Значения, сохраненные здесь, неинициализированы в момент сравнения:

 if(perceptron->input == NULL)
 

и

 if(perceptron->weigths == NULL)
 

и

 if(p->input == NULL)
 

Это означает, что для этих указателей может не быть выделено памяти. Установите их явно NULL , чтобы решить проблему.

Примечание сбоку: Это «вес», а не «вес».

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

1. Спасибо, я забыл установить для них значение NULL, а также спасибо за примечание в разделе «веса».