EXC_BAD_ACCESS в очень простой программе Objective-C (Snow Leopard) - PullRequest
1 голос
/ 19 декабря 2009

Я следую одному из самых ранних примеров в Learning Objective-C на Mac . Мой код почти такой же, как код в книге (пара пробелов и тривиальные скобки могут отличаться). Это выглядит так:

#import <Foundation/Foundation.h>

BOOL areIntsDifferent (int thing1, int thing2) {
    if (thing1 == thing2) {
        return NO;
    }
    else {
        return YES;
    }

}

NSString * boolString (BOOL yesNo) {
    if (yesNo == NO) {
        return (@"NO");
    }
    else {
        return (@"YES");
    }
}


int main (int argc, const char * argv[]) {
    BOOL areTheyDifferent;

    areTheyDifferent = areIntsDifferent(5, 5);
    NSLog(@"are %d and %d different? %@", 5, 5, boolString(areTheyDifferent));

    areTheyDifferent = areIntsDifferent(23, 42);
    NSLog(@"are %d and $d different? %@", 23, 42, boolString(areTheyDifferent));

    return 0;
}

Когда я запускаю код, это то, что я получаю в консоли:

[Session started at 2009-12-19 01:41:37 -0500.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1346) (Fri Sep 18 20:40:51 UTC 2009)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".tty /dev/ttys001
Loading program into debugger…
Program loaded.
run
[Switching to process 3125]
Running…
2009-12-19 01:41:38.432 BOOL Party[3125:a0f] are 5 and 5 different? NO
Program received signal:  “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all

Я не уверен, почему это происходит. Я знаю, что это как-то связано с функцией boolString, потому что, когда я закомментирую вызов, программа работает нормально. Моя интуиция говорит мне, что это как-то связано с некоторыми новыми функциями управления памятью в Snow Leopard (эта книга предшествует Snow Leopard примерно на полгода) Кто-нибудь знает, в чем может быть проблема?

1 Ответ

8 голосов
/ 19 декабря 2009

У вас есть опечатка в строке 30. Вы хотите% d, а не $ d. Поскольку вам не хватает второго десятичного заполнителя, вы в конечном итоге передаете 42 в% @, и NSLog пытается разыменовать область 42 памяти, как если бы это был указатель на строку, и вы вылетаете.

...