2 / 2 / 0
Регистрация: 13.03.2011
Сообщений: 18
|
||||||||||||||||
1 | ||||||||||||||||
Что происходит при char *str = ""?09.10.2012, 13:54. Показов 21207. Ответов 15
Метки нет (Все метки)
Объясните, пожалуйста, что происходит при
И второй вопрос: Почему компилятор выводит предупреждение, если написать предыдущую строчку без const?
0
|
09.10.2012, 13:54 | |
Ответы с готовыми решениями:
15
char* str в int ? реализовать Функция, вставляющая в строку str строку s, начиная с позиции pos. void insert(char str[], char s[], int pos); что и как делает эта строка ciphertext = ciphertext + (char) (str[i] ^ key);? Что лучше Sony STR DE-135 или Sony STR DE-305? |
Заблокирован
|
||||||
09.10.2012, 14:09 | 2 | |||||
- (конечно если есть ; вконце этой строки) - это объявление строкового литерала и такая запись равносильна такой
ругается потому как строковые литералы подразумевают константность но поверь и такой код отработает(правда он не кашерен с точки зрения компиляторов строго работающих в стандарте)
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
09.10.2012, 20:33 | 3 |
Я бы сказал, что он не кошерен с точки зрения программиста, который забьёт на это предупреждение, а потом попробует изменить получившуюся "неконстантную строку". Поэтому советовал бы обращать внимание на сообщения компилятора.
Не согласен с этим. В первом случае строка будет расположена в read-only памяти, и в момент присваивания указатель сохранит только адрес этих данных. Во втором же случае строку будет скопирована в массив (да, имеет место массив, а не указатель), сама строка скорее всего даже не сохранится в read-only памяти. Попытка изменить строку в первом случае (посредством снятия константности, например), скорее всего, приведёт к попытке программы, во втором же случае не должна вызвать проблем.
0
|
Заблокирован
|
|
09.10.2012, 20:49 | 4 |
- любой массив это совокупность ячеек области памяти другое дело что да конст компилятор может запихнуть в страницы со служебной адресацией, а не конст зашить в общедоступную память, но в любом случае есть массив и указателем на него является str. Так что возможно различие в адресации, а так одно и тоже (теже яйца но с боку)
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
09.10.2012, 20:53 | 5 |
-=ЮрА=-, согласен, с точки зрения программиста, которому надо просто где-то сохранить строку, известную на стадии компиляции, разницы никакой. Но о подобных различиях стоит знать хотя бы потому, что константная строка будет загружена вместе с приложением (поскольку хранится в исполняемом файле), а для заполнения массива вызываются подряд несколько (и довольно много для большой по объёму строки) операций записи в память. Это надо иметь ввиду.
С другой стороны, вряд ли кто-то будет "Войну и мир" таскать в исходнике и сохранять в массив, так что это совершенно не критично.
0
|
Заблокирован
|
|
09.10.2012, 21:02 | 6 |
- именно.
При этом любой компилятор имеет жестко лимитированный максимальный объём хранимых конст данных - так что при попытке сохранить как конст текстовик Войны и мира вот таким труюком скажем char * str; #include "VoinaImir.txt"; в котором будет что то вроде str = (char *)"........30 Мб книги"; после линковки мы увидим замечательное ничем неубиваемое сообщение от компилятора что памяти не хватает и чтобы не делали, всё равно упрёмся в макс размер 5-6 Мб и всё.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
09.10.2012, 21:11 | 7 |
-=ЮрА=-, да это-то понятно, "Война и мир" давно является собирательным названием, я его для пущего эффекта применил))
0
|
09.10.2012, 21:13 | 8 |
https://www.cyberforum.ru/blogs/18334/blog97.html далее раздел 4
Там же, раздел 5.2 Бред сивой кобылы. Можешь на это не отвечать, т.к. спорить с тобой всё равно не буду
1
|
panicwassano
|
09.10.2012, 21:14
#9
|
Не по теме: народ ну вы в личку рамситесь :)
0
|
|
09.10.2012, 21:16
#10
|
Не по теме: да, я понял это, я умею смеяться;) Своим постом я хотел лишний раз пользователям подчеркнуть что существует предел размеру конст переменных и чтобы они имели это ввиду. С другой стороны тома войны и мира можно прекрасно сохранить ресурсами приложения, правда это тема уже отдельной беседы и к данной теме имеет лишь факультативное отношение...
0
|
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
|
||||||
09.10.2012, 22:02 | 11 | |||||
А эти записи тоже равносильны?
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
09.10.2012, 22:18 | 12 |
Имя массива в любом случае константный указатель, в то время как указатель на константные данные можно изменить, что бы он указывал на другую область памяти.
0
|
Заблокирован
|
|||||||||||
12.10.2012, 12:04 | 14 | ||||||||||
rangerx, вот такие записи идентичны,
Не по теме: rangerx, жду разъяснений раз уж начали детальный разбор...
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
12.10.2012, 12:20 | 15 | |||||
-=ЮрА=-, Неверно. Они не могут быть идентичны, потому что первое - просто присваивание адреса строкового литерала, а второе - создание массива и копирование символов из строкового литерала в него.
http://liveworkspace.org/code/... 86a7b1cd4f
0
|
silent_1991
|
||||||
12.10.2012, 12:53
Что происходит при char *str = ""?
#16
|
||||||
0
|
12.10.2012, 12:53 | |
Корректно ли? string nonVowel = new char[str.size()]; Простой способ конвертировать INT в Char str[] Char const* str to vector<unsigned int> Equal(str.begin(), str.end(), str.rbegin() При присваивании символа unicode переменной типа char происходит выход за диапазон переменной Лишние знаки в char str[256] после sprintf Что происходит при D < 0 при решении квадратного уравнения? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |