为什么malloc初始化指针是一个nullpointer?

时间:2015-12-17 15:14:16

标签: c pointers malloc

我很确定这是一个简单的错误,但我仍然无法找到它。有人可以发现错误吗?我处理数组weightsmomentumVelocity相同。但是在函数结束后我尝试使用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;
}

1 个答案:

答案 0 :(得分:1)

如果没有其他隐藏的问题,并且您在两次调用malloc时都使用相同的计算:

(l->神经元[j] .numWeights)* sizeof(double)

然后malloc失败并返回空指针。换句话说,您没有足够的连续空闲内存来执行分配。我不知道(l->神经元[j] .numWeights)的价值:如果它是一个巨大的数字而你没有很多内存,那么这可能就是问题所在。

尝试将两次调用交换到malloc,看看第二次调用是否失败。这会告诉你很多。