【问题标题】:Using a multidimensional array within a structure [duplicate]在结构中使用多维数组[重复]
【发布时间】:2018-07-11 20:19:29
【问题描述】:

我写了以下代码:

#include <stdio.h>
#include <stdlib.h>


typedef struct _NeuralNetwork{

    int input_rows;
    int input_columns;
    double **inputs; 

}NeuralNetwork;



void main(){

    // structure variable
    NeuralNetwork *nn;

    int count;
    int i,j;

    nn->input_rows = 2;
    nn->input_columns = 3;

    // create the array of double pointers using # of rows
    nn->inputs = (double **)malloc(nn->input_rows * sizeof(double *));

    // each pointer gets an array of double values
    for (i=0; i<nn->input_rows; i++){
        nn->inputs[i] = (double *)malloc(nn->input_columns * sizeof(double));
    }

    // assign values 
    count = 0;
    for (i = 0; i < nn->input_rows  ; i++)
        for (j = 0; j < nn->input_columns; j++)
            nn->inputs[i][j] = ++count;  

    // print those values
    for (i = 0; i<nn->input_rows; i++)
        for (j = 0; j < nn->input_columns; j++)
            printf("%f ", nn->inputs[i][j]);


    /* Code for further processing and free the 
        dynamically allocated memory*/

    return;
}

当我编译它时,一切都好。但是运行之后,我得到一个分段错误错误:

分段错误(核心转储)

我不确定,错误在哪里。有人可以帮忙吗?

注意:当我使用 nn 作为结构变量而不是结构时,一切都很好。但我想将它用作结构指针并通过“->”而不是通过“。”访问结构成员。因为我打算稍后将nn 作为指向另一个函数的指针传递。

提前谢谢你:)

【问题讨论】:

  • nn 指针在哪里初始化?
  • 我完全忘记了。正如 SenselessCoder(见下文)所说,这是错误的。

标签: c arrays pointers multidimensional-array structure


【解决方案1】:

变量nn 是一个指针,但该指针从未被初始化。随后,您使用nn-&gt;input_rows = 2; 之类的操作读取并取消引用该指针。这会调用undefined behavior

在这种特殊情况下,nn 可能包含一些垃圾值。通过取消引用该指针值,您正在尝试从您可能不允许读取的内存中读取。这就是导致崩溃的原因。

通过将nn 定义为结构的实例而不是指针,正如您所说您尝试过的,您可以避免这个问题。但是,您仍然可以通过获取此变量的地址并将其传递给函数来传递指向其他函数的指针,即:

NeuralNetwork nn;
...
myfunction(&nn)

【讨论】:

  • 是的,没错。 "&" 运算符与 nn 结合使用也可能是一个有效的解决方案。谢谢你,我会注意的。
【解决方案2】:

首先,不要使用void main(),它是非标准的,最终会导致问题。正确的方法是int main()int main(int argc, char** argv)。记得在 main 函数的末尾返回一个合适的值,可能是 0。参考这里参考:main function

其次,如果你使用NeuralNetwork *nn;,你必须在内存中为它分配一些空间。它是一个指向某个内存地址的指针,如果你不分配它谁知道它指向哪里。这就是你得到段错误的原因。您必须按以下方式为其分配内存:

NeuralNetwork *nn = malloc(sizeof(NeuralNetwork));

那么它应该可以正常工作了。

【讨论】:

  • OOOOhhhhhh 对,谢谢....我忘记了,是的。我非常专注于结构指针,以至于我问自己这是否可能是指针取消引用问题。也感谢您的其他建议:)
  • 关于main()格式的吐槽不正确。 void main() 是在托管和独立系统上完美定义的 main() 形式。此外,由于您希望迂腐,int main() 是过时的风格,标记为从 C 语言中删除。正确的形式是int main (void)。如果您阅读的是 C 参考而不是 C++ 参考,您可能会知道这一点。更多信息here.
  • @Lundin 很高兴知道,谢谢。
猜你喜欢
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2010-10-14
  • 2020-09-19
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多