我有以下代码,它是更大程序的一部分。这里N = 108,NDIM = 3。
for(i=0; i<N; i++){
for(j=0; j<NDIM; j++){
r[i][j] = rn[i][j];
printf("The new element (%d, %d) is %lf\n", i,j, r[i][j]);
boxsize[i] = boxsizen[i];
}
}
编译并运行程序会产生分段错误,我已追溯到
行r[i][j] = rn[i][j];
双循环似乎行为正常,直到我得到值应该取值46,而不是我从45跳到1074846117,这显然是一个问题。什么可能导致这个问题?
编辑:
r和rn定义如下
double r[N][NDIM];
double rn[N][NDIM];
和boxsize / boxsizen由
给出double boxsize[NDIM];
double boxsizen[NDIM];
我已经用
替换了r和rn的代码double **r;
r = malloc((N+2)*sizeof(double *));
for(i = 0; i<N; i++){
r[i] = malloc(NDIM * sizeof(double));
}
double **rn;
rn = malloc((N+2)*sizeof(double *));
for(i = 0; i<N; i++){
rn[i] = malloc(NDIM * sizeof(double));
}
现在代码似乎工作正常。
答案 0 :(得分:4)
boxsize
和boxsizen
的维度NDIM
为3
,但是您使用从i
到{0
的{{1}}对其进行索引{1}} N-1
。这是缓冲区溢出。
如果您调整了107
和r
但未修复此错误,那么您的代码仍会被窃听。也许恰好是覆盖没有做任何重要事情的内存,而不是诋毁其他堆栈变量。
答案 1 :(得分:3)
这看起来像是一本教科书缓冲区溢出。典型的原因是您没有为阵列分配足够的空间 - r
或boxsize
可能是罪魁祸首 - 尽管可能存在内存损坏或其他问题。这里的典型调试方法是非常仔细地检查所有索引和所有分配以找出不匹配。