C++ 为数组分配新值时为什么会崩溃?
可能重复:C++ 为数组分配新值时为什么会崩溃?,c++,arrays,visual-c++,for-loop,set,C++,Arrays,Visual C++,For Loop,Set,可能重复: 我的以下代码运行良好: double weight [600] [800][3]; double mean [600] [800][3]; double sd [600] [800][3]; double u_diff [600] [800][3]; for ( int i = 0; i < 600; i ++ ) { for ( int j = 0; j < 800; j ++ ) { for ( int k=0; k < 3;
我的以下代码运行良好:
double weight [600] [800][3];
double mean [600] [800][3];
double sd [600] [800][3];
double u_diff [600] [800][3];
for ( int i = 0; i < 600; i ++ )
{
for ( int j = 0; j < 800; j ++ )
{
for ( int k=0; k < 3; m ++ )
{
weight [i][j][k] = 0;
mean[i][j][k] = 0;
sd[i][j][k] = 6;
}
}
}
但错误依然存在。这里怎么了
mean[i][j][k] = rand();
什么是k
?你是说
mean[i][j][m] = rand();
?
另外,C=3的1/C
为0,因为它们都是int
s。也许您想要1.0/C
编辑和评论后回答:
这些阵列相当大。您应该动态地分配它们
double* mean = new double[600*800*3];
// in the inner loop:
mean[ k + 800*( j + 600*i )] = rand();
// when you're done with them
delete[] mean;
什么是k
?你是说
mean[i][j][m] = rand();
?
另外,C=3的1/C
为0,因为它们都是int
s。也许您想要1.0/C
编辑和评论后回答:
这些阵列相当大。您应该动态地分配它们
double* mean = new double[600*800*3];
// in the inner loop:
mean[ k + 800*( j + 600*i )] = rand();
// when you're done with them
delete[] mean;
我还得到了第一个崩溃的版本(cygwin,4.5.3)
这个问题与有限的堆栈大小有关,大约为2MB
它不会崩溃的原因可能是优化:
由于另一个片段中的“rand”,优化器/编译器不可能
告诉我们根本没有使用该数组——这很可能是可见的
从第一个片段
gcc -std=c99 tst.c -O && ./a.exe -- produces nothing
gcc -std=c99 tst.c && ./a.exe -- segmentation fault
为了避免这个错误,只需使用malloc从堆中分配大数组
(或者通过使用更小的阵列80x60x3来研究限制?)
//tst.c
//编译并运行gcc-std=c99 tst.c-DOK=0-DW=80-DH=60&./a.exe//ok
//或者gcc-std=c99 tst.c-DOK=0-DW=800-DH=600&./a.exe//crash
//或者gcc-std=c99 tst.c-DOK=1-DW=800-DH=600&./a.exe//ok
#包括
int main()
{
#如果可以的话
double*weight=(double*)malloc(W*H*3*sizeof(double));//无崩溃
#否则
双倍重量[W*H*3];//W*H大时崩溃,W*H小时不崩溃
#恩迪夫
int z=0;
对于(int i=0;i
我还得到了第一个崩溃的版本(cygwin,4.5.3)
这个问题与有限的堆栈大小有关,大约为2MB
它不会崩溃的原因可能是优化:
由于另一个片段中的“rand”,优化器/编译器不可能
告诉我们根本没有使用该数组——这很可能是可见的
从第一个片段
gcc -std=c99 tst.c -O && ./a.exe -- produces nothing
gcc -std=c99 tst.c && ./a.exe -- segmentation fault
为了避免这个错误,只需使用malloc从堆中分配大数组
(或者通过使用更小的阵列80x60x3来研究限制?)
//tst.c
//编译并运行gcc-std=c99 tst.c-DOK=0-DW=80-DH=60&./a.exe//ok
//或者gcc-std=c99 tst.c-DOK=0-DW=800-DH=600&./a.exe//crash
//或者gcc-std=c99 tst.c-DOK=1-DW=800-DH=600&./a.exe//ok
#包括
int main()
{
#如果可以的话
double*weight=(double*)malloc(W*H*3*sizeof(double));//无崩溃
#否则
双倍重量[W*H*3];//W*H大时崩溃,W*H小时不崩溃
#恩迪夫
int z=0;
对于(int i=0;i
我尝试在Cygwin(1.7.15)和VC++编译器中构建以下代码,但没有遇到任何崩溃。这对我来说很好
双倍重量[600][800][3]代码>
双均值[600][800][3]代码>
double sd[600][800][3]代码>
double u_diff[600][800][3]代码>
int init=6代码>
intc=3代码>
int main()
{
int i=0;
for(i=0;i<600;i++)
{
int j=0;
for(j=0;j<800;j++)
{
int k=0;
for(k=0;k<3;k++)
{
重量[i][j][k]=1/C;
平均[i][j][k]=rand();
sd[i][j][k]=init;
}
}
}
返回0;
}
我试图在Cygwin(1.7.15)和VC++编译器中构建以下代码,但没有出现任何崩溃。这对我来说很好
双倍重量[600][800][3]代码>
双均值[600][800][3]代码>
double sd[600][800][3]代码>
double u_diff[600][800][3]代码>
int init=6代码>
intc=3代码>
int main()
{
int i=0;
for(i=0;i<600;i++)
{
int j=0;
for(j=0;j<800;j++)
{
int k=0;
for(k=0;k<3;k++)
{
重量[i][j][k]=1/C;
平均[i][j][k]=rand();
sd[i][j][k]=init;
}
}
}
返回0;
}
平均[i][j][k]=rand();这看起来很可疑,如果有更多的上下文会有所帮助。您能否生成一个完整的最小程序来演示错误?请参阅。尝试更正循环定义中的所有临时变量。还可以尝试在赋值循环内设置断点。至少这将有助于找到导致程序崩溃的原因;这看起来很可疑,如果有更多的上下文会有所帮助。您能否生成一个完整的最小程序来演示错误?请参阅。尝试更正循环定义中的所有临时变量。还可以尝试在赋值循环内设置断点。至少这将有助于找到程序崩溃的原因。是的,它是“k”,我编辑过它。我一个接一个地试过,但还是失败了。甚至我删除了“重量”和“意思”,只保留了“sd[I]