Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 包含结构和数组的Seg故障,但不单独_C_Arrays_Struct_Segmentation Fault - Fatal编程技术网

C 包含结构和数组的Seg故障,但不单独

C 包含结构和数组的Seg故障,但不单独,c,arrays,struct,segmentation-fault,C,Arrays,Struct,Segmentation Fault,我正在为我的研究编写一个程序,它需要一个非平凡的索引方案来处理自旋冰系统。为了帮助索引,我使用了结构和数组的组合。每个结构都包含一个立方体单元中包含的16个点[我试图发布一张立方体单元的图片,但stackoverflow说我至少需要10个信誉点,我很抱歉],但是由于数字原因,这些需要存储在一个矩阵中 对于L=1、L=2、L=3,确定系统大小(即模拟立方体的大小)的值可以正常工作。然而,当我尝试L=4时,我有一个seg故障。守则的有关部分如下: /* The indexing of this pr

我正在为我的研究编写一个程序,它需要一个非平凡的索引方案来处理自旋冰系统。为了帮助索引,我使用了结构和数组的组合。每个结构都包含一个立方体单元中包含的16个点[我试图发布一张立方体单元的图片,但stackoverflow说我至少需要10个信誉点,我很抱歉],但是由于数字原因,这些需要存储在一个矩阵中

对于L=1、L=2、L=3,确定系统大小(即模拟立方体的大小)的值可以正常工作。然而,当我尝试L=4时,我有一个seg故障。守则的有关部分如下:

/* The indexing of this program is as 
 *  (i,j,k) refers to which cubic cell you are in 
 *  (l,m) refers to which particle in the cubic cell you are in 
 *  the order is as follows
 *  (l,m) = (1,1) (1,3)   (3,1) (3,3)
 *          (1,0) (1,2)   (3,0) (3,2)
 * 
 *          (0,1) (0,3)   (2,1) (2,3)
 *          (0,0) (0,2)   (2,0) (2,2)
 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define FOR_IJKLM for (i=0; i<L; i++) \
                    for (j=0; j<L; j++) \
                      for (k=0; k<L; k++) \
                        for (l=0; l<4; l++) \
                          for (m=0; m<4; m++)

// L  := integer length of convential cubic cell
// Np := Number of total particles in the system
#define L   4
#define Np  16*L*L*L

struct ConventialCube{
  double p[4][4][3];   // Position of particle 
  double mu[4][4][3];  // Magnetic Moment of particle
};

void initialize(struct ConventialCube cc[][L][L]);

int main(void){
  struct ConventialCube cc[L][L][L]; 
    initialize(cc); 

  double ewaldMatrix[Np][Np];

  return 0;
}

void initialize(struct ConventialCube cc[][L][L]){
  int i, j, k, l, m, d;
  double s = 1.0/sqrt(3);

  double sv[4][3] = {
    {-s,-s,-s},
    {-s, s, s},
    { s,-s, s},
    { s, s,-s}
  };
  double O[4][3] = {
    {0.0, 0.0, 0.0},
    {0.0, 0.5, 0.5},
    {0.5, 0.0, 0.5},
    {0.5, 0.5, 0.0}
  };

  FOR_IJKLM{
    double CO[] = {i,j,k};
    for (d=0; d<3; d++){
      cc[i][j][k].mu[l][m][d] = sv[m][d];
      cc[i][j][k].p[l][m][d] = CO[d] + O[l][d] + O[m][d]/2.0;
    }
  }
}
/*此程序的索引如下所示
*(i,j,k)指的是您所在的立方体单元
*(l,m)指的是立方格中的哪个粒子
*顺序如下
*(l,m)=(1,1)(1,3)(3,1)(3,3)
*          (1,0) (1,2)   (3,0) (3,2)
* 
*          (0,1) (0,3)   (2,1) (2,3)
*          (0,0) (0,2)   (2,0) (2,2)
*/
#包括
#包括
#包括

#为_IJKLM FOR(i=0;i定义堆栈溢出。将两个数组声明为静态:

int main(void){
    static struct ConventialCube cc[L][L][L]; 
    initialize(cc); 

    static double ewaldMatrix[Np][Np];
    return 0;
}
或作为全球成员:

static struct ConventialCube cc[L][L][L]; 
static double ewaldMatrix[Np][Np];

int main(void){
    initialize(cc); 
    return 0;
}

或者,您也可以使用
malloc()在堆上声明这些对象

它在哪里崩溃?如果你发布一个链接到你的图像,我会把它放到问题中。那么,你的调试器说了什么?我不确定,如果我注释掉矩阵并保留其中的结构,它将运行。如果我注释掉结构并保留其中的矩阵,它将运行。变量
double-ewaldMatrix[Np][Np
in
main
对于局部变量来说太大,这将导致堆栈溢出。无论如何,它没有被使用。谢谢,这解决了问题。非常有用,非常感谢。