私はiOS5でrapidxmlのチュートリアルに従っていますが、残念ながら私のcは少し錆びています。次のコードは、より小さな文字サイズではうまく機能しますが、クラッシュします
EXC_BAD_ACCESSより大きなサイズをプルダウンした場合 (RESTful インターフェースから XML をプルしています)。
# pragma mark - parser methods
-(void)parseIncomingFeed:(NSData *)xmlData:(NSString*)tag {
NSString *xmlStringOrg = [[NSString alloc] initWithData:xmlData encoding:NSASCIIStringEncoding];
NSLog(@"[xmlStringOrg length] = %-10d [xmlData length] = %d", [xmlStringOrg length],[xmlData length]);
char xmlString[[xmlStringOrg length]];
strcpy(xmlString, [xmlStringOrg UTF8String]); // <--- crashes here
...
結果は次のとおりです。
[xmlStringOrg length] = 13580 [xmlData length] = 13580
[xmlStringOrg length] = 115476 [xmlData length] = 115476
[xmlStringOrg length] = 154589 [xmlData length] = 154589
[xmlStringOrg length] = 1902 [xmlData length] = 1902
[xmlStringOrg length] = 23402 [xmlData length] = 23402
[xmlStringOrg length] = 93037 [xmlData length] = 93037
[xmlStringOrg length] = 1723 [xmlData length] = 1723
[xmlStringOrg length] = 172329 [xmlData length] = 172329
[xmlStringOrg length] = 3470671 [xmlData length] = 3470671
(boom! with EXE_BAD_ACCESS leading to: 0x3234af6e: push.w {r3, r4})
やみくもに、私は次のことを試しましたが、運がありませんでした:
NSString *xmlStringOrg = [[NSString alloc] initWithData:xmlData encoding:NSASCIIStringEncoding];
char xmlString[3600000];
strcpy(xmlString, [xmlStringOrg UTF8String]);
と
NSString *xmlStringOrg = [[NSString alloc] initWithData:xmlData encoding:NSASCIIStringEncoding];
char xmlString[[xmlStringOrg length]];
strncpy(xmlString, [xmlStringOrg UTF8String], [xmlStringOrg length]);
何か案は?何年も前の私のcクラスから、Xを超えるサイズをチャンクして個別に処理する必要があるように感じますが、どこから始めればよいかわかりません.R
編集1 - 作業中
@RichardJ.RossIII のおかげで、次のように動作します。# pragma mark - parser methods
-(void)parseIncomingFeed:(NSData *)xmlData:(NSString*)tag {
NSString *xmlStringOrg = [[NSString alloc] initWithData:xmlData encoding:NSASCIIStringEncoding];
NSLog(@"[xmlStringOrg length] = %-10d [xmlData length] = %d", [xmlStringOrg length],[xmlData length]);
char *xmlString = (char*) malloc([xmlStringOrg length]);
strcpy(xmlString, [xmlStringOrg UTF8String]); // no more tears
...
free(xmlString);
}