C 在数组上操作时执行非法指令

C 在数组上操作时执行非法指令,c,arrays,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]]++; 我很确定它在这里,因为我把打印语句放在程序中,程序一直工

好的,我试着从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]]++;
        }
    }
}
ff=fopen(fname,“r”);
int bucket[split][split][split];
拆分=(双)1/拆分;

对于(i=0;i请在运行时(使用gdb)共享变量的实际值-split、x、y、z和splits


如果一开始看到正确的值,突然发现异常,则可能是堆栈溢出。因此,请尝试使用动态内存分配(使用堆)。请尝试使用valgrind检测任何内存泄漏。

定义阵列时:

int buckets[split][split][split];
您不会使用以下内容对其进行初始化:

memset(bucket,0x00,sizeof(int)*拆分*拆分*拆分);

所以bucket中有未知的值。然后增加这些数字,但当您这样做时:

直方图[(int)bucket[i][j][k]+;


bucket[i][j][k]
可以等于任何值。解决方案是在数组声明之后添加memset()。

最可能的原因是
bucket[i][j][k]的值
大于
直方图的长度。如果这不是问题,请编辑您的问题以包含最小的自包含测试用例(请参阅).Compiler不会生成非法指令。常见的解释是,缓冲区溢出会破坏堆栈,并在函数返回时导致崩溃。使用调试器并用您发现的内容更新您的问题。使用
printf
可能并不总是给出您的程序失败的确切行,因为您必须对e通过打印
\n
或调用
fflush(stdout)
刷新缓冲区。要查找有问题的行,您可以使用valgrind运行程序。拆分等于什么?它是在运行时设置的还是常量值?代码有两个问题代码有两个问题1)我需要将数组初始化为零值,这要感谢我使用了for循环的新方法。2) 我在for循环中使用了fclose(),因此它一直在重新打开并从头开始