在C中初始化数组时出现分段错误

时间:2014-12-29 05:00:35

标签: c arrays segmentation-fault

我是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;
    }
}

我正在尝试初始化这些数组,但却出现了分段错误。 请帮助我。

3 个答案:

答案 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。它们可能会改变另一个变量的值。他们似乎什么都不做。或者他们似乎可以工作。