将数组的指针更改为更大的数组

时间:2015-08-25 16:27:11

标签: c arrays pointers

所以我试图在人工神经网络上进行实验,或者至少在表面划伤。但这是我的问题,我找不到增加包含其他“神经元”指针的数组大小的方法。

这是我扩展人工神经元大小的代码。

void extendNeuron(NeuronPtr *base, NeuronPtr * dest) { 
  (*(*base)->axon[sizeof((*base)->axon) / sizeof(*(*base)->axon) - 1]) = *dest;

  struct Neuron *** newAxon[sizeof((*base)->axon) / sizeof(*(*base)->axon) + 1];

  memcpy(newAxon, (*base)->axon, sizeof((*base)->axon));

  **(*base)->axon = ***newAxon;
}

这是我神经元的结构

struct Neuron{
  char label[100]; 
  struct Neuron **axon[1];
};

现在我的想法是创建另一个指针数组(struct Neuron ** axon),它比当前数组大(增加1),然后将轴突的指针更改为该数组。但我不知道该怎么做。

到目前为止,这是我的代码:

  struct Neuron ** newAxon[sizeof((*base)->axon) / sizeof(*(*base)->axon) + 1]; //newAxon is supposed to be bigger than the axon of base 

  memcpy(newAxon, (*base)->axon, sizeof((*base)->axon)); //then I'm trying to copy the axon of base to the newAxon

  **(*base)->axon = ***newAxon; //then change the pointer of axon to newAxon

1 个答案:

答案 0 :(得分:1)

我将假设以下内容:

  • axon始终通过malloc(或其衍生产品之一)创建
  • void extendNeuron(NeuronPtr *base, NeuronPtr * dest)在数组base->axon
  • 的末尾添加了dest
  • axon数组如果以空指针终止 - 因为在C中你无法提取数组的大小,所以你必须将其长度保存在辅助变量中或使用约定来识别最后一个元素(或者两者都是比如argv
  • axon只是指向神经元(Neuron **)而非Neuron**[1]
  • 的指针数组

您可以通过这种方式初始化新的Neuron

void init(Neuron *neuron, const char *label) {
    strncpy(neuron->label, label, sizeof(neuron->label));
    neuron->label[sizeof(neuron->label)-1] = '\0'; /* if label was too long */
    neuron->axon = malloc(sizeof(Neuron *));
    /* control neuron->axon != NULL */
    neuron->axon[0] = NULL;
}

您需要一个辅助函数来查找axon数组的长度:

int axon_length(Neuron *neuron) {
    int i = 0;
    while(neuron->axon[i] != NULL) i++;
    return i;
}

然后你可以通过这种方式扩展神经元:

void extendNeuron(NeuronPtr *base, NeuronPtr * dest) {
    int len = axon_length(base);
    Neuron **p = realloc(base->axon, sizeof(Neuron *) * (n+2));
    /* test p != NULL ... */
    base->axon = p;
    p[n] = dest;
    p[n+1] = 0;
}

在发布free(neuron->axon)之前不要忘记调用Neuron以避免内存泄漏...