Ошибка шины на Intel Mac, почему? - PullRequest
0 голосов
/ 21 марта 2011

Тестовая программа, которая вызывает сигнал EXC_BAD_ACCESS.Почему это вызывает ошибку шины?Я хочу изменить «HI» на «fI».

//BUS ERROR TEST

#include <iostream>

void test(char *text)
{
    text[0] = 'f';
}

int main()
{
    char *text = (char *)"HI";
    test(text);
    std::cout << text << std::endl;
    return 0;
}

Ответы [ 3 ]

5 голосов
/ 21 марта 2011

Вы не можете изменять строковые константы, это неопределенное поведение в соответствии со стандартом.

Если вы замените:

char *text = (char *)"HI";

на что-то вроде:

char text[3];
strcpy (text, "HI");

или:

char text[] = "HI";

вы обнаружите, что это будет работать, потому что text в этом случае является модифицируемой памятью.

1 голос
/ 21 марта 2011

Вы не должны разыгрывать const, это UB . Строковые константы доступны только для чтения, поэтому компилятору разрешено помещать их в постоянную память.

1005 * * Используйте
char text[] = "Hi!";

чтобы получить изменяемую строку.

0 голосов
/ 21 марта 2011
char *text = (char *)"HI";
text[0] = 'f';

Это на самом деле противоречит стандарту C ++.Строки в кавычках объявляются const по причине.В вашем случае он, вероятно, хранит строку как часть ваших «кодовых данных», а не обычных «данных».Это, в сочетании с обычным использованием чтения области данных кода, делает ее недоступной для записи в константные строки в кавычках.

...