我很确定这是一个简单的错误,但我仍然无法找到它。有人可以发现错误吗?我处理数组weights
和momentumVelocity
相同。但是在函数结束后我尝试使用momentumVelocity
它是一个空指针。另一方面weights
已初始化。
randomizeNeuron(...)
函数只会更改值,在此函数中,monumentumVelocity`也存在。
typedef struct{
double output;
int numWeights;
double* weights;
double* momentumVelocity;
double wBias;
double error;
double inputSum;
}NeuronTanh;
typedef struct{
int numNeurons;
NeuronTanh* neurons;
}Layer;
typedef struct{
int numLayers;
Layer* layers;
double prevError;
double currentError;
double currentLearningRate;
}Network;
void initializeNetwork(Network* network){
//malloc stuff
network->numLayers = NUMBER_LAYERS;
network->layers = malloc(NUMBER_LAYERS * sizeof(Layer));
network->layers[0].numNeurons = SIZE_INPUT_LAYER;
network->layers[1].numNeurons = SIZE_HIDDEN_LAYER1;
network->layers[2].numNeurons = SIZE_HIDDEN_LAYER2;
network->layers[3].numNeurons = SIZE_OUTPUT_LAYER;
for(int currentLayerIndex=0; currentLayerIndex<network->numLayers;++currentLayerIndex){
Layer *l = &network->layers[currentLayerIndex];
l->neurons = malloc(l->numNeurons * sizeof(NeuronTanh));
for(int j=0; j<l->numNeurons; ++j){
if(currentLayerIndex==0){
l->neurons[j].numWeights = SIZE_INPUT;
}else{
l->neurons[j].numWeights = network->layers[currentLayerIndex-1].numNeurons;
}
l->neurons[j].weights = malloc((l->neurons[j].numWeights) * sizeof(double));
l->neurons[j].momentumVelocity = malloc((l->neurons[j].numWeights) * sizeof(double));
randomizeNeuron(&(l->neurons[j]), getmaxInitValue(network, currentLayerIndex));
}
}
network->currentError = 0;
network->currentLearningRate = LEARNING_RATE;
network->prevError = 0;
}
答案 0 :(得分:1)
如果没有其他隐藏的问题,并且您在两次调用malloc时都使用相同的计算:
(l->神经元[j] .numWeights)* sizeof(double)
然后malloc失败并返回空指针。换句话说,您没有足够的连续空闲内存来执行分配。我不知道(l->神经元[j] .numWeights)的价值:如果它是一个巨大的数字而你没有很多内存,那么这可能就是问题所在。
尝试将两次调用交换到malloc,看看第二次调用是否失败。这会告诉你很多。