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

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

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

Author24 — интернет-сервис помощи студентам
Объясните, пожалуйста, что происходит при
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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 используется побитовая обработка и ключ. */...

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

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

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

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
это объявление строкового литерала и такая запись равносильна такой
Не согласен с этим. В первом случае строка будет расположена в read-only памяти, и в момент присваивания указатель сохранит только адрес этих данных. Во втором же случае строку будет скопирована в массив (да, имеет место массив, а не указатель), сама строка скорее всего даже не сохранится в read-only памяти. Попытка изменить строку в первом случае (посредством снятия константности, например), скорее всего, приведёт к попытке программы, во втором же случае не должна вызвать проблем.
0
Заблокирован
Автор FAQ
09.10.2012, 20:49 4
Цитата Сообщение от silent_1991 Посмотреть сообщение
Во втором же случае строку будет скопирована в массив (да, имеет место массив, а не указатель), сама строка скорее всего даже не сохранится в read-only памяти.
- любой массив это совокупность ячеек области памяти другое дело что да конст компилятор может запихнуть в страницы со служебной адресацией, а не конст зашить в общедоступную память, но в любом случае есть массив и указателем на него является str. Так что возможно различие в адресации, а так одно и тоже (теже яйца но с боку)
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.10.2012, 20:53 5
-=ЮрА=-, согласен, с точки зрения программиста, которому надо просто где-то сохранить строку, известную на стадии компиляции, разницы никакой. Но о подобных различиях стоит знать хотя бы потому, что константная строка будет загружена вместе с приложением (поскольку хранится в исполняемом файле), а для заполнения массива вызываются подряд несколько (и довольно много для большой по объёму строки) операций записи в память. Это надо иметь ввиду.
С другой стороны, вряд ли кто-то будет "Войну и мир" таскать в исходнике и сохранять в массив, так что это совершенно не критично.
0
Заблокирован
Автор FAQ
09.10.2012, 21:02 6
Цитата Сообщение от silent_1991 Посмотреть сообщение
С другой стороны, вряд ли кто-то будет "Войну и мир" таскать в исходнике и сохранять в массив, так что это совершенно не критично.
- именно.
При этом любой компилятор имеет жестко лимитированный максимальный объём хранимых конст данных - так что при попытке сохранить как конст текстовик Войны и мира вот таким труюком скажем
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
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.10.2012, 21:13 8
Цитата Сообщение от Snaiffer Посмотреть сообщение
Объясните, пожалуйста, что происходит при
https://www.cyberforum.ru/blogs/18334/blog97.html далее раздел 4

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

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

Не по теме:

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

0
-=ЮрА=-
09.10.2012, 21:16
  #10

Не по теме:

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

0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
09.10.2012, 22:02 11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
это объявление строкового литерала и такая запись равносильна такой
А эти записи тоже равносильны?
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
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
09.10.2012, 22:18 12
Имя массива в любом случае константный указатель, в то время как указатель на константные данные можно изменить, что бы он указывал на другую область памяти.
0
2 / 2 / 0
Регистрация: 13.03.2011
Сообщений: 18
12.10.2012, 10:27  [ТС] 13
Благодарю всех за разъяснение данного вопроса.
Особенно благодарен Evg. Его статья дает исчерпывающию информацию по топику.
Тему можно считать закрытой.
0
Заблокирован
Автор FAQ
12.10.2012, 12:04 14
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.10.2012, 12:20 15
-=ЮрА=-, Неверно. Они не могут быть идентичны, потому что первое - просто присваивание адреса строкового литерала, а второе - создание массива и копирование символов из строкового литерала в него.

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
silent_1991
12.10.2012, 12:53     Что происходит при char *str = ""?
  #16
 Комментарий модератора 
Всё, сейчас опять 40 страниц настрочим. Если неймётся - в личку (или персонально Юре на почту, по его просьбе).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2012, 12:53

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

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

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

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

При присваивании символа unicode переменной типа char происходит выход за диапазон переменной
В программе при присваивании символа unicode переменной типа char происходит выход за диапазон...

Лишние знаки в char str[256] после sprintf
Значит так, есть парочка массивов которые берут данные из textbox array&lt;Char&gt;^ name =...

Что происходит при D < 0 при решении квадратного уравнения?
что делают последние 2 строчки в данной программе? import math import sys A =...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru