用C语言本地方法访问全局数组时用gcc进行分段错误

时间:2014-09-26 05:57:49

标签: c gcc segmentation-fault

我在下面的代码中使用gcc获得了分段错误:

#include <stdio.h>
#define NT 1000
int arr[NT][6];
int N;

int countifinrange(int i,int max)

    {
        int j=0;
        int icount  = 0;
        for(j=0;j<N;j++)
        if((arr[j][i]<=max)&&(max<=arr[j][i+1]))
            icount++;
        return icount; 
    }

int main (void)
{
    int i, j, value, l, L;
    scanf("%d",&N);

    scanf("%d",&L);  

          for(i=0;i<N;i++)
        {
            for(j=0;j<6;j++)
                 {  
                     scanf("%d",&arr[i][j]);
                 }
         }
     int count;
    for(l=0;l<L;l++)
    for(i=0;i<6;i=i+2)
    {
        for(j=0;j<N;j++)
             {
                  value = arr[j][i];
                   count=countifinrange(j,value);
              } 
     }
     return 0;
}

并使用以下代码:

int countifinrange(int i,int max)

    {
        int j=0;
        int icount  = 0;
        int ij = 0;
        for(j=0;j<N;j++)
        {
            ij = arr[j][i];
        //if((arr[j][i]<=max)&&(max<=arr[j][i+1]))
            icount++;
        }
}

以下代码可以正常使用:

int countifinrange(int i,int max)

    {
        int j=0;
        int icount  = 0;
        int ij = 0;
        for(j=0;j<N;j++)
            {
                arr[j][i];
                //if((arr[j][i]<=max)&&(max<=arr[j][i+1]))
                icount++;
            }
    }

int main (void)
{
    int i, j, value; 
    scanf("%d",&N);
    for(i=0;i<N;i++)
        {
             for(j=0;j<6;j++)
                 {  
                     scanf("%d",&arr[i][j]);
                 }
         }
     int count; 

    for(i=0;i<6;i=i+2)
        {
            for(j=0;j<N;j++)
                {
                      value = arr[j][i];
                      count=countifinrange(j,value);
                 }
         }
         return 0;
   }

该代码在visual studio中工作正常但是使用gcc-4.6.3给出了分段错误。 我是否可以在c,gcc

中的本地方法中访问全局数组

1 个答案:

答案 0 :(得分:0)

看看你的代码...... 2D数组的内部维度是6项宽。然而,无论N是多少,你都会将icount的值增加N倍。我敢打赌它是一个大于6的数字,所以你访问arr越界。

这会调用未定义的行为。它不会在Visual Studio上崩溃的原因只是不幸:“它似乎工作”是一种未定义的行为。