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

在C中初始化数组时出现分段错误,c,arrays,segmentation-fault,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 // Init

我是一个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;
    }
}
我试图初始化这些数组,但却出现了分段错误。
请帮我解决这个问题。

数组初始化导致SEGFALT的唯一原因是读取或写入不存在的元素

实现这一点的最常见方法是使用数组边界之外的索引。在C中,最低的元素是索引0,最高的元素是N-1,其中N是为数组声明的元素数

int  array [5000];

array [-1] = 0;   /* BAD */
array [5000] = 0;   /* BAD */

这两种访问都是无效的。他们可能会犯错。它们可能会更改另一个变量的值。他们似乎什么也不做。或者它们似乎可以工作。

数组初始化导致SEGFALT的唯一原因是读取或写入不存在的元素

实现这一点的最常见方法是使用数组边界之外的索引。在C中,最低的元素是索引0,最高的元素是N-1,其中N是为数组声明的元素数

int  array [5000];

array [-1] = 0;   /* BAD */
array [5000] = 0;   /* BAD */

这两种访问都是无效的。他们可能会犯错。它们可能会更改另一个变量的值。他们似乎什么也不做。或者它们可能看起来很有效。

这一行就是问题所在:

int k=j*grid+i;

这会使数组索引超出范围。当您访问u[k]时,您会遇到seg故障。此外,无需使用2个循环来初始化一维数组,除非您试图在此处实现我不知道的特定逻辑。

这一行是问题所在:

int k=j*grid+i;
这会使数组索引超出范围。当您访问u[k]时,您会遇到seg故障。此外,不需要使用2个循环来初始化一维数组,除非您在这里尝试实现一个我不知道的特定逻辑。

您定义了

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
    }
}
按照相同的分析,确保其他数组初始化不超过边界。

您定义的

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
    }
}

按照相同的分析,确保其他数组初始化不超过边界。

我需要查看数组初始化代码。为什么不:int NU=grid-1*grid;int NV=网格*网格-1;int NP=网格*网格;,每一个变量都是在创建时初始化的吗?@JonathanLeffler尝试过,还是同样的问题;这是风格问题,不是你崩溃的原因。您是否处于任何类型的嵌入式系统的有限环境中。。。?您已经创建了48kib的阵列,这对现在的大多数系统来说应该没有压力。你怎么知道是这些初始化崩溃了?您是否在循环集之间放置了printf语句以便知道哪一个正在崩溃?确保每次格式字符串都以换行符结尾。我需要查看数组初始化代码。为什么不:int NU=grid-1*grid;int NV=网格*网格-1;int NP=网格*网格;,每一个变量都是在创建时初始化的吗?@JonathanLeffler尝试过,还是同样的问题;这是风格问题,不是你崩溃的原因。您是否处于任何类型的嵌入式系统的有限环境中。。。?您已经创建了48kib的阵列,这对现在的大多数系统来说应该没有压力。你怎么知道是这些初始化崩溃了?您是否在循环集之间放置了printf语句以便知道哪一个正在崩溃?确保每次格式字符串都以换行符结尾。据我所知,我已经清楚地定义了数组,并且只初始化了定义的数组。不应该有歧义。@TanmayAgrawal:代码很不清楚。声明是最清楚的,但是初始化逻辑很难遵循。让我更清楚地说明一下。我希望P是一个grid*grid数组,所有值都等于1。数组V将是一个grid*grid-1维,所有值均为0。数组u为grid-1*grid维,所有的j==grid-1,即最上面的y方向等于1,j==grid-2&&i>0&&iAs据我所见,我已经清楚地定义了数组,并且只初始化了定义的数组。不应该有歧义。@TanmayAgrawal:代码很不清楚。声明是最清楚的,但是初始化逻辑很难遵循。让我更清楚地说明一下。我希望P是一个grid*grid数组,所有值都等于1。数组V将是一个grid*grid-1维,所有值均为0。数组u将是grid-1*grid维,所有的j==grid-1,即最顶端的y方向等于1,j==grid-2&&i>0&&iMore具体来说,它是int k=j*grid-1+i。在其他一些地方也存在同样的问题。更具体地说,它应该是int k=j*grid-1+i。其他一些地方也存在同样的问题。