Objective-c EXC_BAD_ACCESS(代码= 2,地址= 0x42)

时间:2012-06-13 03:34:16

标签: objective-c random char exc-bad-access

我是Objective-C编程的新手,当我运行我的小程序时,我收到此错误(我只想生成一个随机字符)。所以这就是我到目前为止所做的:

(IBAction)generate{
  int a = arc4random() % 26;
  NSString * chaine = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  char lettre = [chaine characterAtIndex:a];

  NSMutableString * mot = [[NSMutableString alloc] initWithCharacters:lettre length:1];
  hasard.text = mot;
}

我试图简单地将变量'lettre'放在hasard.text中,但它不能用于错误'不兼容的整数到指针转换从'NSString *'分配给'char'。所以我创建了一个NSMutableString来包含我的角色。

当我在第五行手动输入字符“e”而不是变量“letter”时,效果很好。因为我可以在调试器中看到'lettre'包含一个随机字母,为什么我会在标题中得到错误?

(EXC_BAD_ACCESS (code=2, address=0x42))

6 个答案:

答案 0 :(得分:6)

该函数期望指向一个字符的指针,你给它一个文字字符。您需要创建一个指向它的指针。此外,characterAtIndex不会像您想象的那样返回角色。它返回 unicode字符,实际上是unsigned short而不是unsigned char。但是,如果您将代码更改为此代码,则可以使用:

const unichar foo = [@"Test" characterAtIndex:0];
NSString *test = [NSString stringWithCharacters:&foo length:1]; //Note the &

编辑但最简单的方法就是:

char randChar = arc4random_uniform(26) + 'A'; //Changed in response to Jason Coco's comment
NSString *mot = [NSString stringWithFormat:@"%c", randChar];

答案 1 :(得分:1)

您需要传递const unichar *类型的内容,而不只是char。你可以这样做:

- (IBAction)generate {
  int a = arc4random() % 26;
  NSString * chaine = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  NSMutableString * mot = [chaine substringWithRange:NSMakeRange(a,1)];
  hasard.text = mot;
}

这样你就完全避开了c string baloney。

答案 2 :(得分:0)

对于[NSMutableString initWithCharacters:length:],它接受​​C array of Unicode characters,而不是char

实际上你可以将旧字符串&通过[NSMutableString initWithString]使用字符串。

答案 3 :(得分:0)

initWithCharacters:length:不会将单个字符作为其第一个参数。它需要一组unichars(当然是指针)。如果你传递一个字符,它将尝试取消引用被解释为指针的字符,并且它段错误。

顺便说一下,你生成单字母子串的方法太复杂了。我们有sustringWithRange:方法,因此请使用它:

- (IBAction)generate{
    int a = arc4random() % 26;
    NSString *chaine = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSString *mot = [chaine substringWithRange:NSMakeRange(a, 1)];
    hasard.text = mot;
}

此外,即使这种方法也过于复杂。正如@borrrden指出的那样,只需使用

(arc4random() % 26) + 'A'

代替。

答案 4 :(得分:0)

将char *转换为NSString *

试试这个

link

希望将是一个有用的

答案 5 :(得分:0)

以防任何人仍然访问这个问题,另一个有用的检查方法是确保你不使用ios6特定的代码但是在ios5模拟器中......这就是为我带来并解决问题的原因!