Перейти к содержанию
    

А почему так инициализация

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

Чего тут думают керниганы и примкнувшие, не понимаю. Ну вроде же initialyzer list, почему он не создает временный rw объект и не присваивает ему указатель, а вместо этого прямо в лоб на константный инициализатор ссыль кидает. Где в стандартах этого так называемого языка программирования глянуть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что "the" по стандарту константа.

А указатель на нее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А указатель на нее?

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

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что "the" по стандарту константа.

То есть char a[8] = {1,2}; a[0] = '8' это можно, а первое нельзя?

.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Точно. По указателю на константу ничего не записать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным и при этом гарантированно все обрушить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным и при этом гарантированно все обрушить?

Согласен. Тоже считаю такое недопустимым поведением компилятора. Какой компилятор кста?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным

Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему никто не сказал, что не надо 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 аналогичный трюк работает без предупреждения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В main.c аналогичный трюк работает без предупреждения.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит.

Да ладно? Про какой компилятор речь? 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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласен. Тоже считаю такое недопустимым поведением компилятора. Какой компилятор кста?

Gcc дал warning - deprecated (странный варнинг для такого). M$ проглотил даже без warning

 

Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит.

M$ даже не дал warning в С++ 11 режиме

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

M$ даже не дал warning в С++ 11 режиме

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...