使用NSString getCString时出现EXC_BAD_ACCESS错误

时间:2012-02-05 21:45:05

标签: ios nsstring exc-bad-access cstring

我正在尝试解析一些HTML。我使用stringWithContentsOfURL来获取HTML。我尝试将其加载到字符数组中,以便我可以解析它,但是当调用getCString时,我崩溃了EXC_BAD_ACCESS错误。这是相关代码:

- (void)parseStoryWithURL:(NSURL *)storyURL
{
    _paragraphs = [[NSMutableArray alloc] initWithCapacity:10];
    _read = NO;

    NSError* error = nil;
    NSString* originalFeed = [NSString stringWithContentsOfURL:storyURL encoding:NSUTF8StringEncoding error:&error];

    _i = originalFeed.length;
   char* entireFeed = malloc(_i*sizeof(char));
   char* current = entireFeed;
   char* lagger;
   char* recentChars = malloc(7);
   BOOL collectRecent = NO;
   BOOL paragraphStarted = NO;
   BOOL paragraphEnded = NO;
   int recentIndex = 0;
   int paragraphSize = 0;

   NSLog(@"original Feed: %@", originalFeed);


   _read = [originalFeed getCString:*entireFeed maxLength:_i encoding:NSUTF8StringEncoding];

我也尝试过将'current'指针传递给getCString,但它的行为相同。从我读过的内容中,当您尝试从释放的内存中读取时,通常会抛出此错误。我正在为iOS 5进行内存管理编程。在此之前我将HTML打印到日志中,一切都很好。帮助将不胜感激。我需要通过此错误,以便我可以测试/调试我的HTML解析算法。

PS:如果允许有足够声誉的人,请添加“getCString”作为标记。显然没有人使用这个功能:(

3 个答案:

答案 0 :(得分:1)

一些奇怪的事情;

char* entireFeed[_i];分配一个char *数组,而不是char数组。我怀疑你想要char entireFeed[_i]char *entireFeed = malloc(_i*sizeof(char));

getCString将char *作为第一个参数,也就是说,您应该发送entireFeed而不是*entireFeed

另外,请注意(UTF-8)编码可能会在结果中添加字节,因此为缓冲区分配输入的确切大小可能会导致方法返回NO(缓冲区太小)。你应该真的使用[originalFeed UTF8String]

答案 1 :(得分:1)

尝试显式malloc'ing entireFeed长度为_i(不是100%确定,因为NSUTF8String可能还包括双字节unichars或wchars)而不是古怪的char * entireFeed[_i]你正在做的事情。

我无法想象char * entireFeed[_i]在运行时正在工作(相反,您正在向您的getCString方法传递NULL指针。)

答案 2 :(得分:1)

您的代码存在一些问题 - 您传递的是错误的指针而没有留出足够的空间。可能最简单的方法是使用UTF8String代替:

char *entireFeed = strdup([originalFeed UTF8String]);

最后,您必须使用free(entireFeed)释放字符串。如果您不修改它,您可以使用

const char *entireFeed = [originalFeed UTF8String];

直接

如果你想使用getCString,你需要首先确定长度 - 必须包括终止字符以及编码字符的额外空间,如下所示:

NSUInteger len = [originalFeed lengthOfBytesUsingEncoding: NSUTF8StringEncoding] + 1;
char entireFeed[len];
[originalFeed getCString:entireFeed maxLength:len encoding:NSUTF8StringEncoding];