我正在尝试解析一些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”作为标记。显然没有人使用这个功能:(
答案 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];