操作阵列时的非法指令

时间:2011-12-19 17:11:29

标签: c arrays

好的,所以我试图用c中的三维int数组制作直方图。 这是我编辑数组的行;

buckets[(int)floor(x/splits)][(int)floor(y/splits)][(int)floor(z/splits)]++;

x,y,z在程序的早期生成(这是一个循环),分组被要求作为用户的输入。然后我尝试将这些数据放入直方图中,编译器给我一个非法指令。

histogram[(int)buckets[i][j][k]]++;

我很确定它就在这里,因为我把打印语句放在程序中,直到这一点才开始工作,而不是在后面。这是所有的相关代码。

    ff=fopen(fname,"r");
int buckets[split][split][split];
splits = (double) 1/split;
for(i=0; i<split; i++){
    fscanf(ff,"%lf",&x);
    fscanf(ff,"%lf",&y);
    fscanf(ff,"%lf",&z);
    buckets[(int)floor(x/splits)][(int)floor(y/splits)][(int)floor(z/splits)]++;    
    fclose(ff);  
}
int histogram[10];
for (i=0; i<split; i++) {
    for (j=0; j<split; j++){
        for(k=0;k<split;k++){
            histogram[(int)buckets[i][j][k]]++;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

定义数组时:

int buckets[split][split][split];

您不会使用以下内容对其进行初始化:

memset(buckets, 0x00, sizeof(int) * split * split * split);

因此桶中的值不明。然后你增加这些数字,但是当你这样做时:

histogram[(int)buckets[i][j][k]]++;

buckets[i][j][k]可以等于任何东西。解决方法是在数组声明后添加memset()。

答案 1 :(得分:0)

请在运行时分享变量的实际值(使用gdb) - split,x,y,z和split。

如果您最初看到正确的值并突然看到异常,那么您可能会遇到堆栈溢出。所以尝试使用动态内存分配(使用堆)。请尝试使用valgrind来检测任何内存泄漏。