'FeedForward()' 处的分段错误

Segmentation fault at 'FeedForward()'

我正在用 C 语言制作一个简单的感知模型,我决定要使用不透明指针进行某种抽象。下面的代码可以为问题提供更多线索

perceptron.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

这是我的 perception.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);

}

这是我的main.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:\repos\NeuralNetwork\bin\neuralnetwork.exe
[New Thread 14564.0x49c4]
[New Thread 14564.0x3a44]

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

这是我遇到的错误

我最初的猜测是,也许我正在访问指针感知和 _perceptron 作为 NULL 指针,所以我尝试删除 FeedForward 函数,它似乎工作得很好。我的下一个猜测是输入可能以错误的方式给出,但这似乎 likely.What 不是分段错误的原因。它可能在 main 函数本身中吗?它是否与将 malloc 用于浮点指针有关,或者我的不透明指针的使用是否错误?

此处存储的值在比较时未初始化:

if(perceptron->input == NULL)

if(perceptron->weigths == NULL)

if(p->input == NULL)

这意味着可能没有为这些指针分配内存。将这些显式设置为NULL以解决问题。

旁注:是“权重”,而不是“权重”。