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]