2

我有一些看起来尽可能安全的代码......但我得到了EXC_BAD_ACCESS. 不经常介意,就这一次。

编码:

- (void) deviceListenerCallback:(DeviceEventTypeDef)type data:(void*)data
{
    DeviceInfoDef* o = (DeviceInfoDef*)data;
    char newName[256];
    if (o->DeviceName) {
        strncpy(newName, o->DeviceName, 255);
    } else {
        strncpy(newName, "(null)", 255);
    }
    NSString *deviceNameUTF8 = [NSString stringWithUTF8String:(const char *)newName];

'data' 是从 C 库传递给我们的指针。数据存在且未损坏。

strncpy 中以 newName 结尾的字符是“Network Audio\0\0\0\0\0...”

EXC_BAD_ACCESS我调用 stringWithUTF8String 时,它位于最后一行。错误是:

EXC_BAD_ACCESS (code=1, address=0x30303030)

调用栈是:

CFAllocatorAllocate
................................
5 +[NSString stringWithUTF8String:]
6 -[MyClass deviceListenerCall...

该项目在 ARC 下运行。

谁能指出我必须做错的新手事情?

谢谢,

-肯

4

2 回答 2

1
NSString *deviceNameUTF8 = [NSString stringWithUTF8String: [[NSString alloc] initWithBytes:newName length:255 encoding: NSUTF8StringEncoding]];

我认为这应该可以解决问题。

于 2013-03-14T11:33:39.983 回答
0

strncpy()鉴于输入字符串包含终止字符,我不清楚您为什么要使用它NUL

为什么不deviceNameUTF8直接从创建(误命名为不是 UTF-8)o->DeviceName

- (void) deviceListenerCallback:(DeviceEventTypeDef)type data:(void*)data
{
    DeviceInfoDef* o = (DeviceInfoDef*)data;
    NSString *deviceName;
    if (o != NULL)
        deviceName = [NSString stringWithUTF8String:o->DeviceName];
    else
        deviceName = @"";
于 2013-03-14T11:29:04.423 回答