在结构

时间:2018-02-01 13:28:30

标签: c arrays pointers multidimensional-array structure

我写了以下代码:

#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 作为结构变量而不是结构时,一切都很好。但是我想用它作为结构指针并通过&#34; - &gt;&#34;来访问结构成员。而不是通过&#34;。&#34;因为我打算稍后将nn作为指针传递给另一个函数。

提前谢谢你:)

2 个答案:

答案 0 :(得分:1)

变量nn是一个指针,但该指针永远不会被初始化。随后使用诸如nn->input_rows = 2;之类的操作读取和取消引用该指针。这会调用undefined behavior

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

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

NeuralNetwork nn;
...
myfunction(&nn)

答案 1 :(得分:0)

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

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

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

然后它应该正常工作。