Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/137: Рейтинг темы: голосов - 137, средняя оценка - 4.77
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36

инициализация char (уточнение )

05.12.2011, 23:46. Показов 27583. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
товарищи, как я понимаю, такая инициализация в Си не верна:

C
1
char *pChar = "dsfdsfdsf"
коли да, почему я в интернетах часто встречаю её?
или всё же она верна?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.12.2011, 23:46
Ответы с готовыми решениями:

Error C2440: инициализация: невозможно преобразовать 'int' в 'char [100]'
#include "stdafx.h" #include <string.h> const int max=100; void strcat(char dest, char src) { int n=strlen(dest); ...

Инициализация char в классе
Не понимаю, как поместить символьный массив в класс. На выводе получаются случайные символы. class Person { char last_name; public: ...

Инициализация char массива
Мне нужно объявить и инициализировать массив char'ов. К примеру, char *m_words={'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}; ...

33
Заблокирован
05.12.2011, 23:49
Цитата Сообщение от testsova Посмотреть сообщение
как я понимаю,
Что именно вы понимаете? Что именно вам в этой записи видится неверным?
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
05.12.2011, 23:49
некорректно, потому что "dsfdsfdsf" лежит (по крайней мере должен) в константной области памяти.
0
Заблокирован
05.12.2011, 23:51
Цитата Сообщение от gooseim Посмотреть сообщение
некорректно, потому что "dsfdsfdsf" лежит (по крайней мере должен) в константной области памяти.
Приведите пример, как нужно грамотно инициализировать указатель на литерную константу.
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
05.12.2011, 23:54
Bers,

C++
1
2
const char *pChar = "dsfdsfdsf";
char pChar[] =  "dsfdsfdsf";
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
05.12.2011, 23:56
testsova, строго говоря, это действительно не верно. Правильно было бы
C
1
const char * ptr = "bla bla bla";
Тонкость в том, что в кавычках находится строковый литерал, который должен бы размещаться в памяти, доступной только для чтения. Но на сколько мне известно, все компиляторы допускают подобное объявление. Хуже того, некоторые пропустят даже
C
1
2
char * ptr = "bla bla bla";
*ptr = 'B';
но это в корне не верно, и лучше на такое поведение не закладываться.
1
Заблокирован
05.12.2011, 23:58
Давайте рассмотрим оба случая:

чем таким принципиально этот способ:
C++
1
const char *pChar = "dsfdsfdsf";
отличается от этого:
C++
1
char *pChar = "dsfdsfdsf";

C++
1
char pChar[] = "dsfdsfdsf";
Здесь создаётся массив, который инициализируется значением литерной константы.
Другими словами, теряется время на копирование данных. Не?
0
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36
06.12.2011, 00:06  [ТС]
послушайте. у меня есть сомнения. но я никак не могу для себя объяснить

вот понятный мне, пример:

ch[]="test";
char *pChar = ch // указатель на ch

это я могу себе объяснить таким примером:
C
1
2
3
4
5
    char ch[] = "FIRST";
    char *str = ch;
    printf("%s\n", str);
    strncpy(ch, "LAST", 5);
    printf("%s\n", str);
у меня возникает вопрос, если такое объявление верно
char *ch = "blablabla" ,

то почему мы не выделяем память под хранение это строки?
1
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.12.2011, 00:08
Цитата Сообщение от Bers Посмотреть сообщение
отличается от этого:
дополнительными проверками времени компиляции, что постоянная память не будет модифицирована, нэ?

Добавлено через 1 минуту
Цитата Сообщение от testsova Посмотреть сообщение
то почему мы не выделяем память под хранение это строки?
компилятор выделил ее заранее, то есть это заранее выделенный буфер
изменение которого кстати ведет минимум к undefined behavior, максимум - к runtime error
0
Заблокирован
06.12.2011, 00:11
Цитата Сообщение от alex_x_x Посмотреть сообщение
дополнительными проверками времени компиляции, что постоянная память не будет модифицирована, нэ?
1. Я задаю наводящие вопросы, что бы человек сумел сам во всем разобраться.

2. Нужно понимать, что компилятор не даёт гарантий.
C++
1
2
3
4
5
6
7
8
9
 const char * pChar = "dsfdsfdsf";
 
    pChar[0]='8'; //компилятор не пропустит
                  //error C3892: pChar: невозможно присваивать 
                  //значения переменной,
                  //которая объявлена как константа
 
 
    delete [] pChar; //пропустит, что приведёт к крушению
Таким образом, в обоих случаях нужно аккуратно обращаться с указателями.
Модификатор const далеко не всегда может уберечь от беды.
0
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36
06.12.2011, 00:17  [ТС]
компилятор выделил ее заранее, то есть это заранее выделенный буфер
т.е. это получается выделяется память, как под статический объект, которая никогда не вернётся?
и мы дальше может этому указателю приравнивать строки, акие надо, и каждый раз будет выделяться статически память?

Добавлено через 2 минуты
C
1
2
3
4
5
6
    const char *ch = "FIRST";
    printf("%p\n", ch);
    ch = "test";
    printf("%p\n", ch);
    ch = "gdfgdf";
    printf("%p\n", ch);
вот этот пример, кажеццо, подтверждает, мои слова. что это статическая память выделяется под каждую строку. и ваще, корректе ли он?

Добавлено через 2 минуты
вывод:

%./a.out

0x400668
0x400672
0x400677
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
06.12.2011, 00:19
Цитата Сообщение от testsova Посмотреть сообщение
корректен ли он?
До тех пор, пока не пытаетесь изменить содержимое строк, всё корректно.
0
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36
06.12.2011, 00:22  [ТС]
ладно, патсаны. всем спасибо. форум можно считать закрытым
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.12.2011, 00:22
Bers, ок
testsova,
C++
1
2
3
4
5
6
7
8
9
int main()
{
   const char* sz = "hello";
   printf ("%p\n", sz);
   sz = "hello";
   printf ("%p\n", sz);
   sz = "hello";
   printf ("%p\n", sz);
}
Bash
1
2
3
0x804d368
0x804d368
0x804d368
0
Заблокирован
06.12.2011, 00:23
Если так будит понятнее, то представь себе, что компилятор увидит запись:
C++
1
const char *ch = "FIRST";
И решит, что нужно литерную константу поместить в память. В памяти эта константа будит иметь вид символьного массива.

Таким образом, запись будит эквавалентна:
C++
1
2
3
4
5
const char pChar[] = "FIRST"; //компилятор поместил 
                                            //литерную константу в память.
 
const char *ch = pChar; //твой указатель теперь указывает
                                    // на первую буковку литерной константы
Я конечно утрирую. Реальная "кухня" этого процесса может быть по другому устроенна. Но смысл примерно такой.

Когда ты делаешь:
C++
1
ch = "test";
Аналогично, создаётся ещё один массив в памяти, а твой указатель получает адрес его первой буковки.
0
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36
06.12.2011, 00:38  [ТС]
Цитата Сообщение от alex_x_x Посмотреть сообщение
Bers, ок
testsova,
C++
1
2
3
4
5
6
7
8
9
int main()
{
   const char* sz = "hello";
   printf ("%p\n", sz);
   sz = "hello";
   printf ("%p\n", sz);
   sz = "hello";
   printf ("%p\n", sz);
}
Bash
1
2
3
0x804d368
0x804d368
0x804d368
точно, спасибо.
ради интереса, можно заставить, например gcc, вести по-иному. чтобы он даже для одинаковых констант?

и вот ещё нюанс
C
1
2
3
4
5
6
const char* sz = "hello";
   printf ("%p\n", sz);
   sz = "test";
   printf ("%p\n", sz);
   sz = "hello";
   printf ("%p\n", sz);
Bash
1
2
3
4
%./a.out
0x400668
[B]0x400672[/B]
0x400668
0
06.12.2011, 00:49

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
Если так будит понятнее
Какой смысл пытаться доказать что-то человеку, который так и не поверил, что слово "будет" через е пишется?

2
06.12.2011, 00:55

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
Какой смысл пытаться доказать что-то человеку, который так и не поверил, что слово "будет" через е пишется?
Спросите это у того, кто кому-то что-то пытается доказать.

0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
06.12.2011, 01:09
Цитата Сообщение от testsova Посмотреть сообщение
то почему мы не выделяем память под хранение это строки?
у вас же не возникает вопроса:

почему мы в таком коде
C
1
int n = 1;
не выделяем память под число 1 ?

здесь то же самое...
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.12.2011, 01:21
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
не выделяем память под число 1 ?
здесь то же самое...
слишком тонкий пример =)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.12.2011, 01:21
Помогаю со студенческими работами здесь

Инициализация vector<char>
Добрый день. Подскажи те, как инициализировать vector&lt;char&gt; символами - буквами алфавита.

Инициализация *char в конструкторе
Хай эврибади! class A { private: int a; int b; char *str; public: A() : a(0), b(0) { str = '\0'; }

Инициализация char в конструкторе
class Abit { public: Abit(); ~Abit(); protected: private: bool medal;

Error C2440: инициализация: невозможно преобразовать "const char [12]" в "char *"
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void str_len(char* str) { int i = 0; ...

Инициализация массива char в конструкторе
Вопрос такой. Есть класс simple, в классе есть поле char in. Естественно хочу инициализировать это поле в конструкторе. in={0},...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
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. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru