本文介绍了主题1:EXC_BAD_ACCESS(code = 1,地址=为0x0)标准C内存问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在写code在标准C两个输入文件进行比较,使用X code IDE。我不断收到此错误:线程1:EXC_BAD_ACCESS(code = 1,地址=为0x0)。我已经做了这方面的一些阅读,并认为它是内存问题,但不管是什么似乎我尝试,我不能修复它(我也试图使结构动态使用malloc和上市,在底部在code)。这很奇怪,因为它写的所有数据,然后在最后吐出的错误。文件格式是这样的:
启动(INT)..停止(INT)ID(+或 - )现在有些东西我不关心的行的其余部分
我刚刚上的一个文件,只有+ ID的测试此所以 - 问题的一个方面是不是一部分。反正我很疲惫,并在此一直盯着几个小时,所以请原谅我,如果它没有任何意义,我会睡几个小时后更新。

  typedef结构
{
  INT开始;
  INT停止;
  字符* strandID;
} 位置;INT主(INT ARGC,为const char * argv的[])
{
  如果(argc个!= 4)
  {
    fprintf中(标准错误,
        用法是./a.out windowfile.txt genefile.txt outputFileName);
    出口(-1);
  }  //常量瓦尔
  为const char * windowInput =的argv [1];
  为const char * geneInput =的argv [2];
  为const char * OUTPUTFILE =的argv [3];  const int的windowHeader = 9;
  const int的geneHeader = 3;  //获取结构的大小 - 我已经调试这些正常工作,给我回结构的大小
  const int的posWsize =的getSize(windowInput,+,windowHeader);
  const int的negWsize =的getSize(windowInput, - ,windowHeader);
  const int的posGsize =的getSize(geneInput,+,geneHeader);
  const int的negGsize =的getSize(geneInput, - ,geneHeader);  //声明结构
  位置posWindow [posWsize]
  位置negWindow [negWsize]
  位置posGene [posGsize]
  位置negGene [negGsize]  //此处提取数据
  的getLocations(posWindow,negWindow,windowInput,windowHeader);
  返回0;
}无效的getLocations(位置* posL,位置* negL,为const char *输入,
    const int的头)
{
  FILE * fileptr = NULL;
  fileptr = FOPEN(输入R); //打开文件  如果(fileptr == NULL)
  {//检查错误,同时打开
    fprintf中(标准错误,错误读取%S \\ n,输入);
    出口(-1);
  }  炭tmpLoc [20];
  炭tmpID [2];
  INT eofVar = 0;
  INT lineCount = 0;  而(lineCount<头)
  {//跳过头,并获得数据
    eofVar =龟etc(fileptr);
    如果(eofVar =='\\ n')
      lineCount ++;
  }  INT pCount = 0;
  INT NCOUNT = 0;  而(eofVar!= EOF)
  {
    的fscanf(fileptr,%s%S,tmpLoc,tmpID); //扫描前两个字符串
    如果(!的strcmp(tmpID,+))
    {//如果+链
      字符* locTok = NULL;
      locTok = strtok的(tmpLoc,..); // TOK并获得价值
      posL [pCount]。开始=的atoi(locTok);
      locTok =的strtok(NULL,..);
      posL [pCount] .stop =的atoi(locTok); //错误显示HERE      posL [pCount] .strandID = tmpID;
      的printf(开始=%d个\\ TSTOP =%d个\\ TID =%S \\ tindex =%d个\\ N,posL [pCount]。开始,
          posL [pCount] .stop,posL [pCount] .strandID,pCount);
      pCount ++;
    }
    否则如果(的strcmp(tmpID, - ))
    {//如果 - 链
      字符* locTok = NULL;
      locTok = strtok的(tmpLoc,..); // TOK并获得价值
      negL [NCOUNT]。开始=的atoi(locTok);
      locTok =的strtok(NULL,..);
      negL [NCOUNT] .stop =的atoi(locTok);      negL [NCOUNT] .strandID = tmpID;
      NCOUNT ++;
    }    而((eofVar =龟etc(fileptr))!='\\ n')
    {
      如果(eofVar == EOF)
        打破;
    }
  }  FCLOSE(fileptr);
}//动态的方式...同样的问题 - 只是上面的if语句替换此并使用创建定位功能
如果(!的strcmp(tmpID,+))
{//如果+链
  INT locStart;
  INT locStop;  locStart =的atoi(strtok的(tmpLoc,..)); //托克和获取值
  locStop =的atoi(的strtok(NULL,));  posL [pCount] = * createlocation(locStart,locStop,tmpID);  pCount ++;
}位置* createlocation(INT开始,诠释停止,字符* strandID)
{
  位置* TMP = NULL;
  TMP =(位置*)malloc的(的sizeof(位置)* 1);  tmp->启动=启动;
  tmp->停止=停止;
  tmp-> strandID =(字符*)malloc的(的sizeof(字符)* 2);
  的strcpy(tmp-> strandID,strandID);  返回TMP;
}


解决方案

检查返回值 strtok的

在您的code此处

  locTok =的strtok(NULL,..);
posL [pCount] .stop =的atoi(locTok); //错误显示HERE

strtok的将返回NULL指针,并根据的,

which matches my original guess that because the address code is 0x0 there's a NULL pointer deference somewhere.

Obviously, the following call to atoi is expecting a non-NULL pointer and crashes.

这篇关于主题1:EXC_BAD_ACCESS(code = 1,地址=为0x0)标准C内存问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-04 22:43