2013-03-14 150 views
1

下,我有一些代碼,似乎是安全的,因爲我可以把它...但我越來越EXC_BAD_ACCESS。不經常介意,只是這一次。的iOS stringWithUTF8String(真的CFAllocatorAllocate)EXC_BAD_ACCESS崩潰,ARC

的代碼:

- (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]; 

'數據' 是由一個C庫傳遞給我們的指針。數據是存在的,並且沒有損壞。

從strncpy()函數結束在了newName的字符爲 「網絡音頻\ 0 \ 0 \ 0 \ 0 \ 0 ...」

EXC_BAD_ACCESS是當我打電話stringWithUTF8String的最後一行。錯誤是:

EXC_BAD_ACCESS (code=1, address=0x30303030) 

調用堆棧是:

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

該項目ARC下運行。

任何人都可以指出新手的事情我必須做錯了什麼?

感謝,

-Ken

回答

0

爲什麼你正在使用strncpy()在所有給定的輸入字符串包含終止NUL字符數限制這不是我清楚。

爲什麼不直接從o->DeviceName創建deviceNameUTF8(誤稱爲不是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 = @""; 
+0

的原因strncpy()函數是O可能會爲NULL。在調用代碼有沒有保證,它不是,那麼斷言是不會來這裏是正確的做法。 – 2013-03-27 11:48:15

+0

@KenCorey使用'函數strncpy()'不會在'O'是'NULL'兩種情況下提供幫助。因此,正確的做法是將'NSAssert'改爲'if(o!= NULL)'測試。如果'o'可以是'NULL',那麼提到這可能有助於回答你的問題。 – trojanfoe 2013-03-27 11:50:16

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

我想這應該做的伎倆。

+0

是的,這聽起來像它會工作。但是,我會認爲上面的代碼也會起作用。任何想法實際上是造成問題的原因?通過0x30303030地址碼來判斷,聽起來像是有些東西正在被覆蓋......但除非我明白我的錯誤,否則我無法防範它。 – 2013-03-27 11:50:42