我有一些看似安全的代码,但我得到了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 ...”
当我调用stringWithUTF8String时,EXC_BAD_ACCESS
位于最后一行。错误是:
EXC_BAD_ACCESS (code=1, address=0x30303030)
调用堆栈是:
CFAllocatorAllocate
................................
5 +[NSString stringWithUTF8String:]
6 -[MyClass deviceListenerCall...
该项目在ARC下运行。
有人能指出我必须做错的新手吗?
谢谢,
-Ken
答案 0 :(得分:0)
我不清楚为什么你使用strncpy()
,因为输入字符串包含终止NUL
- 字符。
为什么不直接从deviceNameUTF8
创建o->DeviceName
(错误名称,而不是UTF-8)?
- (void) deviceListenerCallback:(DeviceEventTypeDef)type data:(void*)data
{
DeviceInfoDef* o = (DeviceInfoDef*)data;
NSString *deviceName;
if (o != NULL)
deviceName = [NSString stringWithUTF8String:o->DeviceName];
else
deviceName = @"";
答案 1 :(得分:0)
NSString *deviceNameUTF8 = [NSString stringWithUTF8String: [[NSString alloc] initWithBytes:newName length:255 encoding: NSUTF8StringEncoding]];
我认为这应该可以解决问题。