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

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

09.10.2012, 13:54. Показов 22059. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru