Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2017, 20:33   #11
FerrariF70
Пользователь
 
Регистрация: 05.09.2017
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Нет, когда вы используете строковые литералы ("..."). Массив не причем.
тогда почему нельзя было изменить начальную букву? Как сказал pproger они сидят где то в памяти read only. и как это можно увидеть что указатель находится в памяти read only. мне просто ради любопытства интересно я читал не мало про указатели может что то пропустил.
FerrariF70 вне форума Ответить с цитированием
Старый 05.09.2017, 20:41   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Тут указатели и массивы не причем, просто строковые литералы всегда ридонли в С/С++.

Если вы скопируете оттуда в свой массив (strcpy или объявление массива как в том примере), то можно будет изменять.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.09.2017, 22:22   #13
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

>и как это можно увидеть что указатель находится в памяти read only

пример

Код:
#include <stdio.h>

int main()
{
    const char *str = "hello!";
    puts(str);
    return 0;
}
указатель str ссылается на строковой литерал. он находится в readonly секции исполняемого файла. хотя САМ указатель располагается на стеке, и его как раз можно изменить, например, присвоить ему другой литерал:
Цитата:
str = "bye";
но данные, на которые он указывает все равно нахотятся в rodata.

поэтому нет НИКАКОГО смысла писать
Цитата:
char *str = "hello";
хотя в некоторых учебниках можно это увидеть. все дело в том, что слово const не всегда было в языке C.

а проверить, что находится в ro секции просто:
Цитата:
viper@viper-debian ~ $ readelf -x .rodata a.out

Hex dump of section '.rodata':
0x00000760 01000200 68656c6c 6f2100 ....hello!.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 08.09.2017, 04:28   #14
FerrariF70
Пользователь
 
Регистрация: 05.09.2017
Сообщений: 21
По умолчанию

Цитата:
viper@viper-debian ~ $ readelf -x .rodata a.out

Hex dump of section '.rodata':
0x00000760 01000200 68656c6c 6f2100 ....hello!.
у вас сразу видно потому что через Linux. а у меня он выдавал совсем другое потому что я через Visual Studio:
Цитата:
Exception thrown at 0x00054C5B in название файла: 0xc0000005: Access vilation writing location 0x00056B30.
if there is handler for this exception, the program may be safely continued.

Спасибо за объяснение!

Последний раз редактировалось FerrariF70; 08.09.2017 в 04:49.
FerrariF70 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из текстового файла прочитать предложение, первую букву каждого слова сделать большой romaust C# (си шарп) 0 04.05.2016 10:51
Переписать программу, используя указатели Dark Illusion Общие вопросы C/C++ 0 12.12.2012 12:49
задача используя указатели на структуру ЕВГЕНИЙ Ермакович Помощь студентам 0 04.03.2012 17:36
как упростить код, используя только массивы, циклы, разветвления и указатели? laxe Общие вопросы C/C++ 22 01.09.2009 09:16
нужно решить задачу используя указатели С++ Nastusha Помощь студентам 4 08.02.2009 22:45