Objective c EXC_BAD_访问试图重写由字符串分隔的NSString组件:

Objective c EXC_BAD_访问试图重写由字符串分隔的NSString组件:,objective-c,arrays,nsstring,char,Objective C,Arrays,Nsstring,Char,我正在写一个objective-C程序,用XCODE 4.3.1和ARC处理生物分子的轨迹。我需要读取PDB文件,即解析大量文本格式的数据。我对NSString的低效率感到非常失望,并试图编写一个C等价的ComponentSeparatedByString:。该算法在NSString和NSMutableArray上运行良好,但我很难使用char*和char** 不幸的是,我得到了一个EXC_BAD_访问错误。奇怪的是,我得到了i=68103和j=68049的错误(这些数字给你敲响了警钟吗?),这

我正在写一个objective-C程序,用XCODE 4.3.1和ARC处理生物分子的轨迹。我需要读取PDB文件,即解析大量文本格式的数据。我对NSString的低效率感到非常失望,并试图编写一个C等价的ComponentSeparatedByString:。该算法在NSString和NSMutableArray上运行良好,但我很难使用char*和char**

不幸的是,我得到了一个EXC_BAD_访问错误。奇怪的是,我得到了i=68103和j=68049的错误(这些数字给你敲响了警钟吗?),这意味着它在崩溃之前工作了一段时间。错误为“静态”(始终在相同(i,j)编号处阻塞)。该数组似乎工作得很好(在崩溃前记录其值)

看起来,我对C代码和指针背后的微妙之处不是很有经验,但我肯定会很高兴听到你的建议,让它发挥作用!谢谢

代码如下:

+(char**) componentsSeparedByNewLineCEQUIV:(const char*)aChar:(int*)numWord
{ // char* aChar : my file, is typically 3 millions characters
int j=-1; //Last non space character
int i; //Scanned character
int len=strlen(aChar);

char** stringArray=malloc((*numWord)*sizeof(char*));

for (i=0;i<len; i++)
{   if (aChar[i]==10)
    {
        if ( j!=-1)
        {   
            char* buffer2=malloc(i-j+1);
            strcpy(buffer2, strndup(aChar+j, i-j));
            stringArray[i]=malloc(sizeof(char)*strlen(buffer2)+1); //EXC_BAD_ACCESS HERE
            strcpy(stringArray[i], buffer2);
        }
        j=-1;
    }
    else if (j==-1)
    {j=i;}
}
if (j!=-1)
{   char* buffer2=malloc(i-j+1);
    strcpy(buffer2, strndup(aChar+j, i-j));
    stringArray[i]=malloc(strlen(buffer2)+1);
    strcpy(stringArray[i], buffer2);
}

return stringArray;
}
+(char**)组件paredbynewlineequiv:(const char*)aChar:(int*)numWord
{//char*aChar:我的文件,通常是300万个字符
int j=-1;//最后一个非空格字符
int i;//扫描字符
int len=strlen(aChar);
char**stringArray=malloc((*numWord)*sizeof(char*);

对于(i=0;i您可能不是第一个出现此问题的人:)

为什么不直接使用


PS什么分析表明NSString是您的问题?

您可能不是第一个出现此问题的人:)

为什么不直接使用


PS什么分析表明NSString是您的问题?

我不知道为什么错误出现在应该出现的位置的上面一行。但是您正在复制未分配的字符串。
在stringArray[i]上复制时未分配它buffer2,分配它:

    if ( j!=-1)
    {   
        char* buffer2=malloc(i-j+1);
        strcpy(buffer2, strndup(aChar+j, i-j));
        stringArray[i]=malloc(sizeof(char)*strlen(buffer2)+1); //EXC_BAD_ACCESS HERE
        stringArray[i]=(char*)malloc( (strlen(buffer2)+1)*sizeof(char));  // Allocate the string
        strcpy(stringArray[i], buffer2);
    }

我不知道为什么错误出现在应该出现的位置的上面一行。但是,您正在复制一个未分配的字符串。
在stringArray[i]上复制时未分配它buffer2,分配它:

    if ( j!=-1)
    {   
        char* buffer2=malloc(i-j+1);
        strcpy(buffer2, strndup(aChar+j, i-j));
        stringArray[i]=malloc(sizeof(char)*strlen(buffer2)+1); //EXC_BAD_ACCESS HERE
        stringArray[i]=(char*)malloc( (strlen(buffer2)+1)*sizeof(char));  // Allocate the string
        strcpy(stringArray[i], buffer2);
    }

第一:如果我不是完全错了,但我认为你消耗的内存至少是你需要的4倍:

您正在使用
malloc
创建
buffer2
并使用
strndup
获取所需的字符。
strndup
只需一步即可完成所需操作。
char*buffer2=strndup(aChar+j,i-j)
应该是您的第一步。更糟糕的是,在接下来的两行中,您必须再次执行相同的操作。因此,我认为您真正想要的是
stringArray[i]=strndup(aChar+j,i-j)
。要查看内存问题:所有函数都使用
errno
来指示内存分配失败

第二:函数不返回组件的数量,因此
stringArray
可能包含一些不知道的垃圾


第三:
strlen
很昂贵,您不需要它,只需使用
for(inti=0;aChar[i]!='\0';i++)
首先:如果我不是完全错了,但我认为您消耗的内存至少是您需要的4倍:

您正在使用
malloc
创建
buffer2
并使用
strndup
获取所需的字符。
strndup
只需一步即可完成所需操作。
char*buffer2=strndup(aChar+j,i-j)
应该是您的第一步。更糟糕的是,在接下来的两行中,您必须再次执行相同的操作。因此,我认为您真正想要的是
stringArray[i]=strndup(aChar+j,i-j)
。要查看内存问题:所有函数都使用
errno
来指示内存分配失败

第二:函数不返回组件的数量,因此
stringArray
可能包含一些不知道的垃圾


第三:
strlen
非常昂贵,您不需要它,只需使用
for(int i=0;aChar[i]!='\0';i++)
为所有可能感兴趣的人更新:这是一个工作版本,使用strok可能很有用,尽管我仍然对代码的响应感兴趣

此代码的测试速度是[astring Components SeparatedByString:@“\n”]的5倍(125ms vs 581ms)

+(char**)由换行符分隔的组件:(const char*)aChar:(int*)numWord
{
int i;
int j=0;
int len=strlen(aChar);
*numWord=1;

for(i=0;iupdateforeverywho可能感兴趣的人:这是一个工作版本,使用strtok可能很有用,尽管我仍然对代码的响应感兴趣

此代码的测试速度是[astring Components SeparatedByString:@“\n”]的5倍(125ms vs 581ms)

+(char**)由换行符分隔的组件:(const char*)aChar:(int*)numWord
{
int i;
int j=0;
int len=strlen(aChar);
*numWord=1;

对于(i=0;i您确定没有耗尽堆并在下一行中实际得到错误吗?请检查
malloc
中的返回值。我觉得此函数运行时成本的主要因素是内存分配,而不是字符串-这可能也是在中实现的函数的基本性能问题NSString。事实上,你真的需要拷贝吗?嗯,我迟早会需要的。PDB行是这样的:ATOM 1 N THR 1 64.676 8.697 25.349我迟早会解析结构中的参数(原子、残基、蛋白质),但你是对的,我应该避免多次复制!你确定没有耗尽堆并在下面的一行中得到错误吗?检查
malloc
中的返回值。我觉得这个函数运行时成本的主要因素是内存分配,而不是字符串-这可能也是在NSString中实现的基本性能问题。事实上,您真的需要拷贝吗?嗯,我迟早会需要它。PDB行如下所示:ATOM 1 N THR 1