char *s1 = "emma";
char *s2 = s1;
s2[0] = toupper(s2[0]);
printf("%s\n", s2);
printf("%s\n", s1);
Я балуюсь и изучаю указатели, но я не совсем понимаю, почему я получаю здесь ошибку сегментации. Я знаю, что для функции toupper требуется символ, но разве 0-й элемент строки s2 не является символом? Я знаю, что это указатель, но он указывает на символ, верно? В чем здесь дело?
Также обратите внимание, что s2 указывает на s1. Следовательно, это не копия s1.
Ах, поэтому я не могу изменить предопределенные строки. Не знал этого спасибо. А не могли бы вы уточнить, что такое UB?
UB
означает Undefined Behavior
, что касается вашего утверждения, я не могу изменять предопределенные строки, я предлагаю вам проверить этот пост, stackoverflow.com/questions/12795850/…«Я знаю, что для функции toupper требуется char» --> подробно: toupper()
ожидает int
со значением в диапазоне unsigned char
или EOF
- иначе UB.
Я не совсем понимаю, почему я получаю здесь ошибку сегментации.
Код пытается изменить строковый литерал. То есть УБ. Сделать копию.
UB: Неопределенное поведение — может работать, может давать сбой очевидным или странным образом.
Вы пытаетесь изменить
string literal
, хранящуюся вread only
области памяти, что приводит к UB. Может быть, сделать копиюs1
с помощьюstrdup()
и вместо этого изменить ее?