'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
以解决问题。
旁注:是“权重”,而不是“权重”。
我正在用 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
以解决问题。
旁注:是“权重”,而不是“权重”。