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_ACCESSstringWithUTF8String を呼び出しているときは、最後の行にあります。エラーは次のとおりです。

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 に答える