本文介绍了主题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内存问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!