分段错误大数组

时间:2015-06-02 09:01:33

标签: c arrays

#define n 500
#define N 1024
#define N2 (N/2+1)
#define K2 6
#define BS_base 23
#define BS_exp 2
typedef double complex_double[2];
typedef complex_double Ring_FFT[N2];
typedef Ring_FFT ct_FFT[K2][2];  // Ciphertext in FFT form ct_FFT[K2][2] => Ring_FFT[6][2] => complex_double[6][2][513] => double[6][2][513][2]
typedef ct_FFT BootstrappingKey[n][BS_base][BS_exp]; 
//BootstrappingKey[500][23][2] => ct_FFT[500][23][2] => ct_FFT[500][23][2][6][2] => complex_double[500][23][2][6][2][513] => double[500][23][2][6][2][513][2]
typedef struct {
BootstrappingKey *BSkey;
SwitchingKey *KSkey;
} EvalKey;


EvalKey EK;
EK.BSkey = (BootstrappingKey*) malloc(sizeof(BootstrappingKey));
printf("sizeof BootstrappingKey: %lu\n",sizeof(BootstrappingKey));
printf("EK.BSkey: %p\n",EK.BSkey);
if(EK.BSkey == NULL) {
    fprintf(stderr, "BAD BAD BAD!\n");
    return -1;
}

EK.KSkey = (SwitchingKey*) malloc(sizeof(SwitchingKey));

if(EK.KSkey == NULL) {
    fprintf(stderr, "EVEN WORSE!\n");
    return -1;
}
printf("\nPointer value of EK.BSkey = %p\n",(EK.BSkey));
printf("\nPointer value of EK.KSkey = %p\n",(EK.KSkey));
printf("Starting another huge loop\n");
for(int i =0; i< n; ++i)
  for(int j=0;j < BS_base;++j)
    for(int k=0;k < BS_exp; ++k)
      for(int l=0; l < K2; ++l)
        for(int a =0; a <2; ++a)
          for(int b =0; b < N2; ++b)
            for(int c =0; c < 2; ++c){
                printf("Arrrrgh: i=%d, j=%d, k=%d, l=%d, a=%d, b=%d, c=%d\n",i,j,k,l,a,b,c);
                *(EK.BSkey)[i][j][k][l][a][b][c] = 1.0;
              }

对于同态加密项目,这是一个非常大的数组。但是我不断遇到分段错误。我为了调试目的写了这个forloop。一旦循环到达:

Arrrrgh: i=0, j=22, k=1, l=5, a=1, b=512, c=1<br>
Arrrrgh: i=1, j=0, k=0, l=0, a=0, b=0, c=0

我遇到了分段错误(Valgrind的输出):

  

== 8127 ==写入大小为8无效   == 8127 ==在0x401CFB:FHEWKeyGen(FHEW.c:100)   == 8127 == by 0x400D94:main(gen.c:46)

我真的很感激一些帮助。

1 个答案:

答案 0 :(得分:1)

*(EK.BSkey)[i][j][k][l][a][b][c]应为(*EK.BSkey)[i][j][k][l][a][b][c]

您需要取消引用指针EK.BSkey以获取它指向的数组的指示符,然后应用所有索引。

你原来的方式相当于EK.BSkey[i][j][k][l][a][b][c][0];最高优先级操作是EK.BSkey[i],如果i > 0读取越界,因为EK.BSkey指向BootstrappingKey的单个实例。

我认为循环索引的顺序正确!