Продолжайте получать BAD_ACCESS при компиляции C в Xcode

0

Если я начну новый проект командной строки C в Xcode и введите следующий код, я всегда получаю ошибку EXC_BAD_ACCESS при компиляции проекта.

int main(int argc, const char * argv[])
{
    char *foo = "Hello";
    *foo = 'M'; // get EXC_BAD_ACCESS here when compiling
}

Я просто изучаю C и не могу тренироваться, что не так с этим утверждением? Я просто пытаюсь изменить символ в определенном месте памяти. У кого-нибудь есть идеи?

  • 4
    foo указывает на строковый литерал. Вы не можете изменить его (буквальное, не foo .)
  • 0
    И вы не получите EXC_BAD_ACCESS при компиляции этого кода. Вы получаете это при запуске .
Показать ещё 1 комментарий
Теги:
xcode

2 ответа

0
Лучший ответ

Ваш код имеет неопределенное поведение. Вы пытаетесь изменить строковый литерал.

  • 0
    Спасибо, теперь я вижу, что я пытаюсь изменить строковый литерал.
1

BAD_ACCESS - для Mac, какая ошибка сегментации для Linux. Вы развращаете память. Я также предполагаю, что вы получите эту ошибку во время выполнения, а не компиляцию (потому что это было бы странно).

РЕДАКТИРОВАТЬ:

Я также хотел бы отметить, что при распределении статически этого не произойдет.

int main(int argc, const char * argv[])
{
    char foo[] = "Hello";
    *foo = 'M'; // no more EXC_BAD_ACCESS here
}
  • 0
    Что ж, вы, скорее всего, не повреждаете память, поскольку распределение, скорее всего, происходит на странице памяти только для чтения.
  • 0
    Это не только для чтения памяти. Если вызвать printf ("% s \ n", foo), результат будет "Mello"
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню