【问题标题】:C structs, pointers to structs, and proper initializationC 结构、指向结构的指针和正确的初始化
【发布时间】:2011-10-17 20:44:07
【问题描述】:

我正在努力将神经网络模拟器从 Perl 转换为 C。我可以让它工作,但我对我的部分代码不满意。我已经定义了一个结构网络(类型定义为 NETWORK),它包含一个指向双精度数组的指针和一个指向 NEURON 指针数组的指针,这是另一个结构。以下是它们的定义方式:

typedef struct neuron {
    double *inputweights;
    double *neuronweights;
    double value;
} NEURON; 

typedef struct network {
    NEURON **neurons;
    double *outputs;
} NETWORK;

最初,我尝试像这样初始化它们:

NEURON* myvariable;

但这当然不起作用,因为实际上没有分配内存。我知道我可以这样初始化它:

NEURON myvariable;
NEURON* ptr = &myvariable;

但是当我尝试在循环中执行此操作并将指针存储在数组中时,似乎以前的指针在每次迭代时都丢失或重置,并且我遇到了各种错误。我正在做这样的事情:

NETWORK mynetwork;
for (i = 0; i < NEURON_COUNT; i++) {
    NEURON myneuron;
    reset_neuron(&myneuron); // Basically a zero fill of the arrays
    mynetwork->neurons[i]=&myneuron;
    myneuron->inputweights[0] = 1; // Sets the current neuron, first input
    printf("First neuron, first input is %f\n", mynetwork->neurons[0]->inputweights[0]);
    // The printf gives 1 on the first iteration, and 0 on every following iteration.
}

这给我的印象是 myneuron 始终是 /same/ 内存位置,即使我仍然保留指向最后一个的指针,所以我一直重置同一个位置。当然我也可以使用 malloc 来强制每个神经元不同:

NEURON* myvariable = malloc(sizeof(NEURON));

这行得通,但这似乎有点像拼凑。我应该费心使用指向我的结构的指针吗?有没有办法在不使用低级 malloc 和 sizeof 的情况下初始化结构指针?

【问题讨论】:

  • 我知道你想要'NEURON myneuron;'成为某种形式的声明 - 它是,但循环结束后,你的对象也会消失。这就是为什么我们有 malloc
  • 酷,一个随机的忍者对一个两年前的问题投反对票。

标签: c


【解决方案1】:

这正是malloc 的用途。当您需要不同数量的特定类型的对象并需要控制它们的分配位置时,您可以使用malloc。为什么它看起来像一个杂物?

【讨论】:

  • 我想只是我不习惯低级内存管理,似乎自己分配内存是应该只在异常情况下才应该做的事情,但如果你说我应该这样做这样做就可以了。我只是显然需要确保结构中的所有指针也用malloc() 初始化。关于结构如何布置的任何 cmet?我想知道它们是否可以设计得更好,或者是否有理由将指向数组/结构的指针放在结构中而不是数组/结构本身?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2021-05-26
相关资源
最近更新 更多