169 похожих чатов

Сейчас будет довольно нубский вопрос Если я правильно понимаю, то строковый

литерал, будучи r-значением дает нам указатель на константые данные в статической памяти. Тогда почему это компилируется?
char *str = "1234";
*str = '0';
Даже без ворнингов. Clang 12 на linux mint, никаких вербозных флагов компилятора не включал. Да, я получаю сегфолт, но все же

При этом меня сильно смутило следующее
const int a = 42;
int *b = &a;
*b = 10;
printf("a = %d, b = %d", a, *b);
Тут я получаю ворнинг и вывод 42, 10. Число было скопировано? Куда?
Или я нарвался на UB? Четкого понимания взаимодействия указателей на константы и неконстанты нет(

9 ответов

21 просмотр

И то, и другое -- UB. Для диагностики и вообще чистоты кода рекомендую всегда собирать с -Wall -Wextra -Werror. Можно ещё -pedantic для гурманов.

Во втором случае скорее всего выделился кусочек стека в момент взятия адреса, но это всё не имеет значения.

Первое явно разрешено в си (каст, не запись), второе я удивлен, что компилируется

wrongnull_t- Автор вопроса

Спасибо С этими флагами первый пример все еще компилируется и все еще сегфолт во втором я получаю ошибку :)

wrongnull_t- Автор вопроса

Т.е. можно скастовать указатель на константу до указателя на неконстанту, но при попытке перезаписи по адресу будет ub?

так константа же после компиляции н чем не отоичается от неконстанты

так константа же после компиляции н чем не отоичается от неконстанты

С чего бы численная константа гарантированно не отличалась? В некоторых асмах (ЕМНИП x86 среди них) небольшие численные константы просто зашиты в параметрах операций (типа add r0, 1 -> r1). При наличии оптимизации Constant Propagation вместо выделения места на стеке под константную переменную её значение пропагируется к юзерам, что вместе с наличием механизма зашивания численных констант в аргументы операций делает понятие адреса константной переменной бессмысленным. Ну и Constant Propagation - эта одна из основных оптимизаций, так что сомневаюсь, что она отключена в -O0.

Для строк да

Похожие вопросы

Обсуждают сегодня

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
> Копаем глубже > Следующий момент был, когда я спросил его, знает ли он JavaScript. Он ответил, что его учили работать с C#. Я тоже в университете писал на C#, но даже там мн...
Oleg Volkov
4
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Карта сайта