我是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;
}
}
我正在尝试初始化这些数组,但却出现了分段错误。 请帮助我。
答案 0 :(得分:4)
这一行是问题所在:
int k=j*grid+i;
它使您的数组索引超出范围。当您访问u[k]
时,您会遇到seg错误。此外,没有必要使用2个循环来初始化单维数组,除非你试图在这里实现一个我不知道的特定逻辑。
答案 1 :(得分:1)
您已定义
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
}
}
遵循相同的分析以确保其他阵列初始化不超过边界。
答案 2 :(得分:0)
数组初始化导致SEGFALT的唯一原因是读取或写入不存在的元素。
实现此目的的最常见方法是使用超出数组边界的索引。在C中,最低元素是索引0
(零),最高元素是N-1
,其中N
是为数组声明的元素数。
int array [5000];
array [-1] = 0; /* BAD */
array [5000] = 0; /* BAD */
这两种都是无效访问。他们可能是SEGFAULT。它们可能会改变另一个变量的值。他们似乎什么都不做。或者他们似乎可以工作。