a未处理的异常:访问冲突读取位置0x00000004

时间:2011-07-05 06:27:09

标签: c++ visual-c++

当我第一次遇到下面代码中的标记行时,我在调试模式下出现此错误

#include<fstream>
#include<iostream>
#include<math.h>
#include<string>

using namespace std;

int main()
{int t,i,j,k,n,g[100],w[100],opp[100];
float rpi[100],wp[100],owp[100],oowp[100];
char s[100][100];
ifstream ip; ip.open("A-small-practice.in"); ofstream op; op.open("A_out.in");
ip>>t; 
for(i=0;i<t;i++)
  { ip>>n;
    memset(g,0,sizeof(g));
    memset(w,0,sizeof(w));
    memset(op,0,sizeof(op));
    memset(rpi,0,sizeof(rpi));
    memset(wp,0,sizeof(wp)); 
    memset(owp,0,sizeof(owp));
    memset(oowp,0,sizeof(oowp));
    memset(s,'.',sizeof(s));

    for(j=0;j<n;j++)
      {for(k=0;k<n;k++)
        {ip>>s[j][k]; //<--------------------the error occurs here
        if(s[j][k]=='0')
          g[j]++;
    if(s[j][k]=='1')
      {g[j]++;w[j]++;}
        }
      wp[j]=w[j]/g[j];
     }

    for(j=0;j<n;j++)
      {for(k=0;k<n;k++)
       if(j!=k && s[k][j]!='.')
           {owp[j]+=(wp[k]*g[k]-s[k][j])/(g[k]-1);
           opp[j]++;
           }
       owp[j]/=opp[j];
      } 

    for(j=0;j<n;j++)
      {for(k=0;k<n;k++)
        {if(j!=k && s[k][j]!='.')
         oowp[j]+=owp[k];
        }
       oowp[j]/=opp[j]; 
      }

   op<<"Case #"<<i+1<<": \n"; 
    for(j=0;j<n;j++)
    {rpi[j]=(0.25*wp[j]) + (0.5*owp[j]) +(0.25*oowp[j]);
    op<<rpi[j]<<"\n";
     } 
 } 
return 0; 
}

调试器在介入时在此代码段中断。循环和逻辑值的大小都是正确的我不知道溢出在哪里发生..是否还有其他原因?

    class _Sentry_base
    {   // stores thread lock and reference to input stream
public:
    __CLR_OR_THIS_CALL _Sentry_base(_Myt& _Istr)
        : _Myistr(_Istr)
        {   // lock the stream buffer, if there
        if (_Myistr.rdbuf() != 0)//<-------------break points here
            _Myistr.rdbuf()->_Lock();
        }

1 个答案:

答案 0 :(得分:2)

您不需要将memset用于1D阵列。例如

 int g[100] = {0};

会奏效。

对于2D数组,循环使用for循环并将每个元素设置为'.',或者坚持使用memset进行该步骤。

就实际问题而言,您可能需要使用ip.get()来逐字逐句阅读。

相关问题