Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/104: Рейтинг темы: голосов - 104, средняя оценка - 4.57
2 / 2 / 0
Регистрация: 13.03.2011
Сообщений: 18

Что происходит при char *str = ""?

09.10.2012, 13:54. Показов 22002. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объясните, пожалуйста, что происходит при
C++
1
const chat *str = "hello"
Т.е. тут явно у нас присутствует только объявления указателя str, но как выделяется память для строки "hello"?

И второй вопрос:
Почему компилятор выводит предупреждение, если написать предыдущую строчку без const?
C++
1
chat *str = "hello"
C++
1
warning: deprecated conversion from string constant to ‘char*[-Wwrite-strings]
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.10.2012, 13:54
Ответы с готовыми решениями:

char* str в int ?
в char* str есть набор целых чисел , введенных через пробел (1 2 3). нужно перевести их в int

реализовать Функция, вставляющая в строку str строку s, начиная с позиции pos. void insert(char str[], char s[], int pos);
срочно помогите!!!!!!!!!!!!!!!!!!

что и как делает эта строка ciphertext = ciphertext + (char) (str[i] ^ key);?
вот код: /* В этой реализации интерфейса ICipher используется побитовая обработка и ключ. */ class BitCipher : ICipher { ushort...

15
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.10.2012, 14:09
Цитата Сообщение от Snaiffer Посмотреть сообщение
const char *str = "hello"
- (конечно если есть ; вконце этой строки) - это объявление строкового литерала и такая запись равносильна такой
C++
1
const char str[] = "hello"
В результате такого объявления компилятор выделяет память под число символов в кавычках и к этому блоку автоматически пристыковывает \0 (т.е обнулять конец не следует)

Цитата Сообщение от Snaiffer Посмотреть сообщение
char *str = "hello"
ругается потому как строковые литералы подразумевают константность но поверь и такой код отработает(правда он не кашерен с точки зрения компиляторов строго работающих в стандарте)
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.10.2012, 20:33
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
он не кашерен с точки зрения компиляторов строго работающих в стандарте
Я бы сказал, что он не кошерен с точки зрения программиста, который забьёт на это предупреждение, а потом попробует изменить получившуюся "неконстантную строку". Поэтому советовал бы обращать внимание на сообщения компилятора.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
это объявление строкового литерала и такая запись равносильна такой
Не согласен с этим. В первом случае строка будет расположена в read-only памяти, и в момент присваивания указатель сохранит только адрес этих данных. Во втором же случае строку будет скопирована в массив (да, имеет место массив, а не указатель), сама строка скорее всего даже не сохранится в read-only памяти. Попытка изменить строку в первом случае (посредством снятия константности, например), скорее всего, приведёт к попытке программы, во втором же случае не должна вызвать проблем.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.10.2012, 20:49
Цитата Сообщение от silent_1991 Посмотреть сообщение
Во втором же случае строку будет скопирована в массив (да, имеет место массив, а не указатель), сама строка скорее всего даже не сохранится в read-only памяти.
- любой массив это совокупность ячеек области памяти другое дело что да конст компилятор может запихнуть в страницы со служебной адресацией, а не конст зашить в общедоступную память, но в любом случае есть массив и указателем на него является str. Так что возможно различие в адресации, а так одно и тоже (теже яйца но с боку)
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.10.2012, 20:53
-=ЮрА=-, согласен, с точки зрения программиста, которому надо просто где-то сохранить строку, известную на стадии компиляции, разницы никакой. Но о подобных различиях стоит знать хотя бы потому, что константная строка будет загружена вместе с приложением (поскольку хранится в исполняемом файле), а для заполнения массива вызываются подряд несколько (и довольно много для большой по объёму строки) операций записи в память. Это надо иметь ввиду.
С другой стороны, вряд ли кто-то будет "Войну и мир" таскать в исходнике и сохранять в массив, так что это совершенно не критично.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.10.2012, 21:02
Цитата Сообщение от silent_1991 Посмотреть сообщение
С другой стороны, вряд ли кто-то будет "Войну и мир" таскать в исходнике и сохранять в массив, так что это совершенно не критично.
- именно.
При этом любой компилятор имеет жестко лимитированный максимальный объём хранимых конст данных - так что при попытке сохранить как конст текстовик Войны и мира вот таким труюком скажем
char * str;
#include "VoinaImir.txt";
в котором будет что то вроде str = (char *)"........30 Мб книги";
после линковки мы увидим замечательное ничем неубиваемое сообщение от компилятора что памяти не хватает и чтобы не делали, всё равно упрёмся в макс размер 5-6 Мб и всё.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.10.2012, 21:11
-=ЮрА=-, да это-то понятно, "Война и мир" давно является собирательным названием, я его для пущего эффекта применил))
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.10.2012, 21:13
Цитата Сообщение от Snaiffer Посмотреть сообщение
Объясните, пожалуйста, что происходит при
https://www.cyberforum.ru/blogs/18334/blog97.html далее раздел 4

Цитата Сообщение от Snaiffer Посмотреть сообщение
Почему компилятор выводит предупреждение, если написать предыдущую строчку без const?
Там же, раздел 5.2

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
это объявление строкового литерала и такая запись равносильна такой
Бред сивой кобылы. Можешь на это не отвечать, т.к. спорить с тобой всё равно не буду
1
09.10.2012, 21:14

Не по теме:

народ ну вы в личку рамситесь :)

0
09.10.2012, 21:16

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
-=ЮрА=-, да это-то понятно, "Война и мир" давно является собирательным названием, я его для пущего эффекта применил))
да, я понял это, я умею смеяться;)
Своим постом я хотел лишний раз пользователям подчеркнуть что существует предел размеру конст переменных и чтобы они имели это ввиду. С другой стороны тома войны и мира можно прекрасно сохранить ресурсами приложения, правда это тема уже отдельной беседы и к данной теме имеет лишь факультативное отношение...

0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
09.10.2012, 22:02
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
это объявление строкового литерала и такая запись равносильна такой
А эти записи тоже равносильны?
C++
1
2
3
4
5
6
7
8
9
10
11
const char* func1() {
 
    const char* s = "text";
    return s;
}
 
const char* func2() {
 
    const char s[] = "text";
    return s;
}
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
09.10.2012, 22:18
Имя массива в любом случае константный указатель, в то время как указатель на константные данные можно изменить, что бы он указывал на другую область памяти.
0
2 / 2 / 0
Регистрация: 13.03.2011
Сообщений: 18
12.10.2012, 10:27  [ТС]
Благодарю всех за разъяснение данного вопроса.
Особенно благодарен Evg. Его статья дает исчерпывающию информацию по топику.
Тему можно считать закрытой.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
12.10.2012, 12:04
rangerx, вот такие записи идентичны,
C++
1
2
const char* s1  = "text";
const char s2[] = "text";
речь шла именно об этом
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
int main()
{
    const char* s1  = "text";
    const char s2[] = "text";
    cout<<s1<<endl;
    cout<<s2<<endl;
    return 0;
}
http://codepad.org/TDMqKPXw
Output:
1
2
text
text
Добавлено через 5 минут

Не по теме:

rangerx, жду разъяснений раз уж начали детальный разбор...

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.10.2012, 12:20
-=ЮрА=-, Неверно. Они не могут быть идентичны, потому что первое - просто присваивание адреса строкового литерала, а второе - создание массива и копирование символов из строкового литерала в него.

http://liveworkspace.org/code/... 86a7b1cd4f

C++
1
2
3
4
5
6
7
8
9
10
11
const char* func1() {
 
    const char* s = "text";
    return s;
}
 
const char* func2() {
 
    const char s[] = "text";
    return s;
}
Какой код корректный, если перефразировать rangerx. Или оба корректны?
0
12.10.2012, 12:53
 Комментарий модератора 
Всё, сейчас опять 40 страниц настрочим. Если неймётся - в личку (или персонально Юре на почту, по его просьбе).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2012, 12:53
Помогаю со студенческими работами здесь

Что лучше Sony STR DE-135 или Sony STR DE-305?
Здравствуйте. Скажите, пожалуйста, какой из усилителей получше Sony STR DE-135 или Sony STR DE-305? И где можно посмотреть год...

Корректно ли? string nonVowel = new char[str.size()];
При определение строки можно ли её инициализировать выделением памяти, что бы её потом переинициализировать? А как её тогда удалить? ...

Простой способ конвертировать INT в Char str[]
Всем привет. Столкнулся с маленькой но большой как оказалось проблемой. Опишу детально. Есть спрока: char str = &quot;Hello...

Char const* str to vector<unsigned int>
Добрый день! На visual studio 2012 не работает код: char const* str{ &quot;1 2 4 12 5123&quot; }; std::istringstream iss{ str }; ...

Equal(str.begin(), str.end(), str.rbegin()
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; string str; int main() { setlocale(LC_ALL, &quot;rus&quot;); cin &gt;&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru