DASM 0 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба struct lala { char *p; } .... lala la = {"the"}; *(la.p) = '1'; // access violation Чего тут думают керниганы и примкнувшие, не понимаю. Ну вроде же initialyzer list, почему он не создает временный rw объект и не присваивает ему указатель, а вместо этого прямо в лоб на константный инициализатор ссыль кидает. Где в стандартах этого так называемого языка программирования глянуть? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба Потому что "the" по стандарту константа. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба Потому что "the" по стандарту константа. А указатель на нее? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба А указатель на нее? Указатель модифицировать можно, а вот содержимое инициализатора - нет: char *p = "abc"; defines p with type ‘‘pointer to char’’ and initializes it to point to an object with type ‘‘array of char’’ with length 4 whose elements are initialized with a character string literal. If an attempt is made to use p to modify the contents of the array, the behavior is undefined. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба Потому что "the" по стандарту константа. То есть char a[8] = {1,2}; a[0] = '8' это можно, а первое нельзя? . Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба Указатель модифицировать можно, а вот содержимое инициализатора - нет Точно. По указателю на константу ничего не записать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба Указатель модифицировать можно, а вот содержимое инициализатора - нет: А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным и при этом гарантированно все обрушить? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным и при этом гарантированно все обрушить? Согласен. Тоже считаю такое недопустимым поведением компилятора. Какой компилятор кста? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба struct lala { char *p; } .... lala la = {"the"}; *(la.p) = '1'; // access violation А чего другого вы ожидали? Грубо влезли в область хранения указателя "p" - вместо адреса реального объекта накидали туда всякого "мусора". И после этого пытаетесь пользоваться этим "указателем" ... :smile3046: К слову. Более современные компиляторы уже ругаются на такие дикости lala la = {"the"}: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings] Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным и при этом гарантированно все обрушить? Потому что это си. https://stackoverflow.com/questions/2245664...rals-in-c-and-c Нет, вру. "struct lala ... lala la" - это не си. Это кривой вопрос, т.к. правильный вопрос должен указывать и название компилятора тоже. Вот, например, компилятор gcc char * test = "TEST"; ../Common/main.cpp:41:16: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] В main.c аналогичный трюк работает без предупреждения. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба В main.c аналогичный трюк работает без предупреждения. Обычный "С" gcc по-умолчанию компилирует в архаичном стандарте "C99", хотя можно заставить его применить более свежие стандарты, например, "C11". Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит. Да ладно? Про какой компилятор речь? IAR вполне себе тоже "проглатывает" :(((( В примере: static void Func(char *s) { s[1] = 0; } static char const t1[] = "test"; static char const *t2 = "test"; Func("test"); Func(t1); Func(t2); негодование компилятора (IAR_7.80) вызывают только последние 2 строчки, но к сожалению никак не Func("test"); :( Хотя хоть убей - не пойму в чём принципиальная разница между Func("test"); и static char const t1[] = "test"; Func(t1); ? Language: C++; Dialect: Extended Embedded C++ (default). Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба Согласен. Тоже считаю такое недопустимым поведением компилятора. Какой компилятор кста? Gcc дал warning - deprecated (странный варнинг для такого). M$ проглотил даже без warning Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит. M$ даже не дал warning в С++ 11 режиме Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба M$ даже не дал warning в С++ 11 режиме Вполне возможно, что у него соотв. ворнинги запрещены через соотв. ключи компиляции самой средой с целью, чтобы "без нытья" собирался откровенный ****-код :) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться