spirit_1 5 11 ноября, 2023 Опубликовано 11 ноября, 2023 (изменено) · Жалоба On 11/11/2023 at 4:15 PM, EdgeAligned said: Еще одна картинка: (поскольку запускаю отладку из SRAM, то вся программа вместе с текстом и константами находится тоже в RAM, в её начале. Но если запустить из флеша, то это поместится во флеш). строка с массивом символов находится в секции .rodata, то есть является константным неизменяемым значением. А указатель на строку указывает на первый адрес этого константного массива, но ячейка указателя помещается в области стека. спасибо, но указатель я получаю только один раз при ее создании. И если я в этот указатель потом запишу другой адресс то НАВСЕГДА потеряю доступ к этой статичской ячейке?? Верно? Т.е в случае обычной переменной я ВСЕГДА знаю адрес этой ячейки. В случае описанном выше я получаю лишь ОДИН раз при создании и при перезаписвынии указателя содержащего этот адресс я его теряю навсегда , хотя ячейка в памяти сеществует и успешно живет int a =5; int * ptr = &a; ptr = 0x678954 перезаписали адрес ячейки другим ptr = &a восстановили адрес ячейки ............ char * str = "jjj"; str = 0x98686969 перезаписали адрес строки другим. АДРЕС ПОТЕРЯН БЕЗВОЗВРАТНО!! Изменено 11 ноября, 2023 пользователем spirit_1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 11 ноября, 2023 Опубликовано 11 ноября, 2023 (изменено) · Жалоба Теоретически да. Но практически вы можете вручную посмотреть адрес начала строки и вручную цифрами присвоить конкретный адрес указателю: temp = (char*)0x08000000 Но, на практике, как правило, используется другой подход. Строка объявляется как указатель на массив символьных констант и этот указатель не изменяется, он служит "сигнатурой" строки. char *const msg1 = "Text1"; char *const msg2 = "Text2"; char *const msg3 = "Text3"; const char *ptr; ptr = msg1; ptr = msg2; ptr = msg3; Изменено 11 ноября, 2023 пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spirit_1 5 11 ноября, 2023 Опубликовано 11 ноября, 2023 · Жалоба On 11/11/2023 at 4:30 PM, EdgeAligned said: Теоретически да. Но практически вы можете вручную посмотреть адрес начала строки и вручную цифрами присвоить конкретный адрес указателю: temp = (char*)0x08000000 Но, на практике, как правило, используется другой подход. Строка объявляется как указатель на массив символьных констант и этот указатель не изменяется, он служит "сигнатурой" строки. const char *msg1 = "Text1"; const char *msg2 = "Text2"; const char *msg3 = "Text3"; const char *ptr; ptr = msg1; ptr = msg2; ptr = msg3; Да, я понимаю но меня интресовал именно этот теоретический аспект без константы , насколько правильно я все понял. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 15 ноября, 2023 Опубликовано 15 ноября, 2023 (изменено) · Жалоба char * str = "jjj"; str = 0x98686969 перезаписали адрес строки другим. АДРЕС ПОТЕРЯН БЕЗВОЗВРАТНО!! Если я правильно понял сомнение на счет потери адреса строки "jjj" навсегда, то в этом ничего катастрофического нет. Так как если вы объявите еще раз char * x= "jjj", то компилятор использует ту же самую строку из флэша повторно и получите Вы свой адрес снова. И в этом контекесте "jjj"- можно назвать ресурсом. И в зависимости от уровня оптимизации в современных компиляторах локальная переменная может жить всё время существования функции, а может и возвращать память в стек после момента когда она уже не нужна. Утечки памяти могут возникать только после malloc или new. В других случаях никакие утечки не могут случиться. Изменено 15 ноября, 2023 пользователем kan35 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться