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

On 11/11/2023 at 4:15 PM, EdgeAligned said:

Еще одна картинка: (поскольку запускаю отладку из SRAM, то вся программа вместе с текстом и константами находится тоже в RAM, в её начале. Но если запустить из флеша, то это поместится во флеш). 

 

Снимок экрана 2023-11-11 211304.jpg

строка с массивом символов находится в секции .rodata, то есть является константным неизменяемым значением. А указатель на строку указывает на первый адрес этого константного массива, но ячейка указателя помещается в области стека.

спасибо, но  указатель я получаю только один раз при ее создании. И если я  в этот указатель потом запишу другой адресс то НАВСЕГДА потеряю доступ к этой статичской ячейке?? Верно?

 

Т.е в случае обычной переменной я ВСЕГДА знаю адрес этой ячейки. В случае описанном выше  я получаю лишь ОДИН раз при создании и при перезаписвынии указателя  содержащего этот адресс я его теряю навсегда , хотя ячейка в памяти сеществует и успешно живет

 

int a =5;

int * ptr = &a;

ptr = 0x678954 перезаписали адрес ячейки другим

ptr = &a восстановили адрес ячейки

 

............

char * str = "jjj";

str = 0x98686969  перезаписали адрес строки другим. АДРЕС ПОТЕРЯН БЕЗВОЗВРАТНО!!

 

 

Изменено пользователем spirit_1

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


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

Теоретически да. Но практически вы можете вручную посмотреть адрес начала строки и вручную цифрами присвоить конкретный адрес указателю: temp = (char*)0x08000000

Но, на практике, как правило, используется другой подход. Строка объявляется как указатель на массив символьных констант и этот указатель не изменяется, он служит "сигнатурой" строки.

	char *const msg1 = "Text1";
	char *const msg2 = "Text2";
	char *const msg3 = "Text3";

	const char *ptr;
	ptr = msg1;
	ptr = msg2;
	ptr = msg3;

 

 

Изменено пользователем EdgeAligned

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


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

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;

 

 

Да, я понимаю но меня интресовал именно этот теоретический аспект без константы , насколько правильно  я все понял. Спасибо!

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


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

char * str = "jjj";

str = 0x98686969  перезаписали адрес строки другим. АДРЕС ПОТЕРЯН БЕЗВОЗВРАТНО!!

Если я правильно понял сомнение на счет потери адреса строки "jjj" навсегда, то в этом ничего катастрофического нет. Так как если вы объявите еще раз char * x= "jjj", то компилятор использует ту же самую строку из флэша повторно и получите Вы свой адрес снова. И в этом контекесте "jjj"- можно назвать ресурсом.

И в зависимости от уровня оптимизации в современных компиляторах локальная переменная может жить всё время существования функции, а может и возвращать память в стек после момента когда она уже не нужна. Утечки памяти могут возникать только после malloc или new. В других случаях никакие утечки не могут случиться.

Изменено пользователем kan35

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...