|
|
|
А почему так инициализация |
|
|
|
Jul 25 2018, 07:04
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(DASM @ Jul 24 2018, 21:43) CODE struct lala { char *p; } .... lala la = {"the"}; *(la.p) = '1'; // access violation А чего другого вы ожидали? Грубо влезли в область хранения указателя "p" - вместо адреса реального объекта накидали туда всякого "мусора". И после этого пытаетесь пользоваться этим "указателем" ... К слову. Более современные компиляторы уже ругаются на такие дикости lala la = {"the"}: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jul 25 2018, 09:56
|
Профессионал
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877
|
Цитата(DASM @ Jul 24 2018, 22:00) А почему никто не сказал, что не надо 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 аналогичный трюк работает без предупреждения.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Jul 25 2018, 10:20
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(XVR @ Jul 25 2018, 10:58) Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит. Да ладно? Про какой компилятор речь? 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).
|
|
|
|
|
Jul 25 2018, 15:22
|
Гуру
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493
|
Цитата(jcxz @ Jul 25 2018, 08:16) Согласен. Тоже считаю такое недопустимым поведением компилятора. Какой компилятор кста? Gcc дал warning - deprecated (странный варнинг для такого). M$ проглотил даже без warning Цитата(XVR @ Jul 25 2018, 10:58) Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит. M$ даже не дал warning в С++ 11 режиме
|
|
|
|
|
|
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|