реклама на сайте
подробности

 
 
6 страниц V   1 2 3 > »   
Closed TopicStart new topic
> А почему так инициализация
DASM
сообщение Jul 24 2018, 18:43
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



CODE
struct lala
{
char *p;
}
....
lala la = {"the"};
*(la.p) = '1'; // access violation

Чего тут думают керниганы и примкнувшие, не понимаю. Ну вроде же initialyzer list, почему он не создает временный rw объект и не присваивает ему указатель, а вместо этого прямо в лоб на константный инициализатор ссыль кидает. Где в стандартах этого так называемого языка программирования глянуть?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 24 2018, 18:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Потому что "the" по стандарту константа.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 24 2018, 18:52
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(aaarrr @ Jul 24 2018, 21:46) *
Потому что "the" по стандарту константа.

А указатель на нее?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 24 2018, 18:54
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Jul 24 2018, 21:52) *
А указатель на нее?

Указатель модифицировать можно, а вот содержимое инициализатора - нет:
Цитата
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.
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 24 2018, 18:56
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(aaarrr @ Jul 24 2018, 21:46) *
Потому что "the" по стандарту константа.

То есть char a[8] = {1,2}; a[0] = '8' это можно, а первое нельзя?
.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 24 2018, 18:59
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата
Указатель модифицировать можно, а вот содержимое инициализатора - нет

Точно. По указателю на константу ничего не записать.
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 24 2018, 19:00
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(aaarrr @ Jul 24 2018, 21:54) *
Указатель модифицировать можно, а вот содержимое инициализатора - нет:

А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным и при этом гарантированно все обрушить?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 25 2018, 05:16
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(DASM @ Jul 24 2018, 22:00) *
А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным и при этом гарантированно все обрушить?

Согласен. Тоже считаю такое недопустимым поведением компилятора. Какой компилятор кста?
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 07:04
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 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" - вместо адреса реального объекта накидали туда всякого "мусора".
И после этого пытаетесь пользоваться этим "указателем" ... smile3046.gif

К слову. Более современные компиляторы уже ругаются на такие дикости lala la = {"the"}: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 25 2018, 07:58
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(DASM @ Jul 24 2018, 22:00) *
А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным

Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jul 25 2018, 09:56
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 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 аналогичный трюк работает без предупреждения.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 10:02
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(esaulenka @ Jul 25 2018, 12:56) *
В main.c аналогичный трюк работает без предупреждения.

Обычный "С" gcc по-умолчанию компилирует в архаичном стандарте "C99", хотя можно заставить его применить более свежие стандарты, например, "C11".


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 25 2018, 10:20
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(XVR @ Jul 25 2018, 10:58) *
Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит.

Да ладно? Про какой компилятор речь? IAR вполне себе тоже "проглатывает" sad.gif(((

В примере:
Код
  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"); sad.gif
Хотя хоть убей - не пойму в чём принципиальная разница между Func("test"); и static char const t1[] = "test"; Func(t1); ?
Language: C++; Dialect: Extended Embedded C++ (default).
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 15:22
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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 режиме
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 15:26
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 25 2018, 18:22) *
M$ даже не дал warning в С++ 11 режиме

Вполне возможно, что у него соотв. ворнинги запрещены через соотв. ключи компиляции самой средой с целью, чтобы "без нытья" собирался откровенный ****-код sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

6 страниц V   1 2 3 > » 
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 03:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.02647 секунд с 7
ELECTRONIX ©2004-2016