14

我正在使用 Xcode IDE 编写代码来比较标准 C 中的两个输入文件。我不断收到此错误:线程 1:EXC_BAD_ACCESS(代码=1,地址=0x0)。我已经对此进行了一些阅读,并认为这是一个内存问题,但无论我尝试什么,我似乎都无法修复它(我也尝试过使用 malloc 动态制作结构并将其列在底部编码)。这很奇怪,因为它会写入所有数据,然后在最后吐出那个错误。文件格式是这样的: start(int)..stop(int) id(+ or -) 现在一些我不关心的东西我刚刚在一个文件上测试了这个只有+ id,所以“-”方面不是问题的一部分。反正我已经很累了,已经盯着这个看了几个小时,如果没有请见谅

typedef struct
{
  int start;
  int stop;
  char *strandID;
} location;

int main(int argc, const char * argv[])
{
  if (argc != 4)
  {
    fprintf(stderr,
        "Usage is ./a.out windowfile.txt genefile.txt outputFileName");
    exit(-1);
  }

  //const vars
  const char *windowInput = argv[1];
  const char *geneInput = argv[2];
  const char *outputfile = argv[3];

  const int windowHeader = 9;
  const int geneHeader = 3;

  //get size of structures -- I have debugged and these work correctly, returning the size of my structure
  const int posWsize = getSize(windowInput, "+", windowHeader);
  const int negWsize = getSize(windowInput, "-", windowHeader);
  const int posGsize = getSize(geneInput, "+", geneHeader);
  const int negGsize = getSize(geneInput, "-", geneHeader);

  //declare structs
  location posWindow[posWsize];
  location negWindow[negWsize];
  location posGene[posGsize];
  location negGene[negGsize];

  //extract data here
  getLocations(posWindow, negWindow, windowInput, windowHeader);
  return 0;
}

void getLocations(location *posL, location *negL, const char *input,
    const int header)
{
  FILE *fileptr = NULL;
  fileptr = fopen(input, "r"); //open file

  if (fileptr == NULL)
  { //check for errors while opening
    fprintf(stderr, "Error reading %s\n", input);
    exit(-1);
  }

  char tmpLoc[20];
  char tmpID[2];
  int eofVar = 0;
  int lineCount = 0;

  while (lineCount < header)
  { //skip header and get to data
    eofVar = fgetc(fileptr);
    if (eofVar == '\n')
      lineCount++;
  }

  int pCount = 0;
  int nCount = 0;

  while (eofVar != EOF)
  {
    fscanf(fileptr, "%s %s", tmpLoc, tmpID); //scan in first two strings
    if (!strcmp(tmpID, "+"))
    { //if + strand
      char *locTok = NULL;
      locTok = strtok(tmpLoc, ".."); //tok and get values
      posL[pCount].start = atoi(locTok);
      locTok = strtok(NULL, "..");
      posL[pCount].stop = atoi(locTok); //ERROR IS SHOWN HERE

      posL[pCount].strandID = tmpID;
      printf("start=%d\tstop=%d\tID=%s\tindex=%d\n", posL[pCount].start,
          posL[pCount].stop, posL[pCount].strandID, pCount);
      pCount++;
    }
    else if (!strcmp(tmpID, "-"))
    { //if - strand
      char *locTok = NULL;
      locTok = strtok(tmpLoc, ".."); //tok and get values
      negL[nCount].start = atoi(locTok);
      locTok = strtok(NULL, "..");
      negL[nCount].stop = atoi(locTok);

      negL[nCount].strandID = tmpID;
      nCount++;
    }

    while ((eofVar = fgetc(fileptr)) != '\n')
    {
      if (eofVar == EOF)
        break;
    }
  }

  fclose(fileptr);
}

//dynamic way...same issue -- just replace this with the above if statement and use the create location function
if (!strcmp(tmpID, "+"))
{ //if + strand
  int locStart;
  int locStop;

  locStart = atoi(strtok(tmpLoc, ".."));//tok and get values
  locStop = atoi(strtok(NULL, ".."));

  posL[pCount] = *createlocation(locStart, locStop, tmpID);

  pCount++;
}

location *createlocation(int start, int stop, char *strandID)
{
  location *tmp = NULL;
  tmp = (location *) malloc(sizeof(location) * 1);

  tmp->start = start;
  tmp->stop = stop;
  tmp->strandID = (char *) malloc(sizeof(char) * 2);
  strcpy(tmp->strandID, strandID);

  return tmp;
}
4

5 回答 5

5

检查 的返回值strtok

在您的代码中

locTok = strtok(NULL, "..");
posL[pCount].stop = atoi(locTok); //ERROR IS SHOWN HERE

strtok正在返回一个 NULL 指针,并根据文档

如果没有要检索的令牌,则返回空指针。

这与我最初的猜测相符,因为地址代码在0x0某处存在 NULL 指针引用。

显然,下面的调用atoi期待一个非 NULL 指针并崩溃。

于 2013-10-08T07:27:34.487 回答
3

您还可以在 Xcode 中使用异常断点。

异常断点告诉调试器在程序中任何地方遇到问题时暂停,因此您可以在程序崩溃之前评估程序的状态。

转到断点导航 (Cmd+8),然后单击左下角的 + 按钮并选择添加异常断点。你可以把它放在那里。

在此处输入图像描述

于 2020-01-15T05:15:11.407 回答
0

就我而言,我使用了错误的块类型。出于某种原因,开发人员在其他地方将块标记为const id blockName = ^(Type variableName) { /* code */ } but unfortunately the Type mismatched . Because blockName was declared as typeid , the compiler could not warn me properly when I passed blockName` 作为参数,而这个错误发生在运行时。

例如:

    const id callback = ^(ARTPaginatedResult<ARTMessage *> * _Nullable paginatedResult, ARTErrorInfo * _Nullable error) { /* code */

    [channel setOptions:channelOptions callback:callback];

上面的块有 3 个参数,但channel:setOptions:callback:定义了 1 个参数称为callback,它必须是一个带有 1 个参数的块,并声明为

- (void)setOptions:(ARTRealtimeChannelOptions *_Nullable)options callback:(nullable void (^)(ARTErrorInfo *_Nullable))cb;
于 2021-10-07T16:12:07.510 回答
0

为 xc

在您的main()函数中,尝试删除char*argv[]或删除两个参数。

于 2020-05-12T02:29:11.523 回答
-3

您应该删除主函数的参数。它会起作用。

于 2017-03-11T02:55:06.123 回答