对字符串的NULL终止进行错误访问

时间:2014-06-30 09:50:10

标签: objective-c c xcode

-(void)myStartMethod{
    NSString *str = @"testing";
    char *charStr = [str UTF8String];
    charStr[4] = '\0'; // bad access on this line.
    NSLog(@"%s",charStr);
}

我正在尝试终止第四个字符串上的字符串并将输出打印为" test"。 我错过了什么?

由于C编程可以与Objective-c(foundation framework)一起使用,因此它会导致错误访问。这种类型的char数组修改在C (GCC)中完全有效。

我怎样才能避免它背后的原因。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

The documentation州提供了相当不错的提示:

  

<强> UTF8字符串

     

返回接收器的以null结尾的UTF8表示。

     

- (const char *)UTF8String

所以,很明显你修改它是错误的。事实上,您应该收到将const char *转换为普通char *的警告。

此外,'\0'字符的名称不是NULL,用于指针。

答案 1 :(得分:1)

Apple标题[str UTF8String]返回const char*,无法修改。

答案 2 :(得分:1)

正如其他答案所提到的,您无法修改从NSString实例返回的UTF-8字符串。

而是使用此代码:

-(void)myStartMethod{
    NSString *str = @"testing";
    NSString *part = [str substringWithRange:NSMakeRange(0, 4)];
    char *charStr = [part UTF8String];
    NSLog(@"%s",charStr);
}

或:

-(void)myStartMethod{
    NSString *str = @"testing";
    NSString *part = [str substringWithRange:NSMakeRange(0, 4)];
    NSLog(@"%@", part);
}