我是一个非常初学者在C,我经历了现有的问题,但无法理解,因为他们涉及字符串和字符。下面是我代码中的一小部分:
#define grid 32
int main (void)
{
int NU, NV, NP;
NU=(grid-1)*grid;
NV=grid*(grid-1);
NP=grid*grid;
double u[NU], uc[NU];
double v[NV], vc[NV];
double p[NP], pc[NP];
//Initialization
// Initializing u
for (i=0; i<(grid-1); i++)
{
for (j=0; j<(grid); j++)
{
int k=j*grid+i;
if (j==(grid-1))
{
u[k]=1.0;
}
else if (j==(grid-2) && i>0 && i<(grid-2))
{
u[k]=1.0;
}
else
{
u[k]=0.0;
}
}
}
// Initializing v
for (j=0; j<(grid-1); j++)
{
for (i=0; i<grid; i++)
{
int k=j*grid+i;
v[k]=0.0;
}
}
// Initializing p
for (j=0; j<grid; j++)
{
for (i=0; i<grid; i++)
{
int k=j*grid+i;
p[k]=1.0;
}
}我正在尝试初始化这些数组,但却得到了分段错误。请帮我这个忙。
发布于 2014-12-29 05:08:09
这一行是问题所在:
int k=j*grid+i;它会使数组索引超出界限。当您访问u[k]时,您将得到一个seg错误。此外,没有必要使用2个循环来初始化一个一维数组,除非这里有一个我不知道的特定逻辑。
发布于 2014-12-29 05:22:21
你定义了
NU=(grid-1)*grid;
NV=grid*(grid-1);
NP=grid*grid;现在,让我们看看您在多大程度上访问循环中的数组元素。
for (i=0; i<(grid-1); i++)
{
for (j=0; j<(grid); j++)
{
int k=j*grid+i; // so in the max case k = (grid-1)*grid+grid-2 = grid*grid+2
... // and it is larger than NU so it will be accessing wrong memory
// memory region
}
}按照相同的分析,以确保其他数组初始化不超过边界。
发布于 2014-12-29 05:06:31
数组初始化可以导致SEGFALT的唯一原因是通过读取或写入不存在的元素。
实现这一点的最常见方法是使用超出数组界限的索引。在C中,最低的元素是索引0 (0),最高的是N-1,其中N是为数组声明的元素数。
int array [5000];
array [-1] = 0; /* BAD */
array [5000] = 0; /* BAD */这两种访问都是无效的。他们可能会。它们可能会改变另一个变量的值。他们似乎什么也没做。或者他们看起来很管用。
https://stackoverflow.com/questions/27683629
复制相似问题