powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++
18 сообщений из 18, страница 1 из 1
C++
    #34111506
Oleg_2006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не много умею писать программы на С++, MFC-6.0
Поясните ржавому чайнику:
char *p = "TTTTTTTTTTTTTTTTTTTT";
int fx()
{
p[0]='X';
Программа валится Здесь!!
...........


char p[] = "TTTTTTTTTTTTTTTTTTTT";
int fx()
{
p[0]='X';
Все на месте !!
...........
Извините за нелепый вопрос, благодарю за ответ!
...
Рейтинг: 0 / 0
C++
    #34111539
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вообше-то в первом случае имеет место глобальный указатель на строковая константа, а во втором глобальный массив символов. вещи неуловимо, но разные.
...
Рейтинг: 0 / 0
C++
    #34111581
Oleg_2006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мой пример - это чистое воспроизведение ситуации, и я с вами согласен,
однако по ходу решения задачи мне необходимо модифицировть текст.
не проходит и следующее

int fx()
{
char *p = { UUUUUUuu};
p[0]='L';
...
Рейтинг: 0 / 0
C++
    #34111641
kvasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_2006Я не много умею писать программы на С++, MFC-6.0
Поясните ржавому чайнику:
char *p = "TTTTTTTTTTTTTTTTTTTT";
int fx()
{
p[0]='X';
Программа валится Здесь!!
...........


char p[] = "TTTTTTTTTTTTTTTTTTTT";
int fx()
{
p[0]='X';
Все на месте !!
...........
Извините за нелепый вопрос, благодарю за ответ!


позвольте вставить свое "ква"
пока в С не написал ни строчки, решил пока тренироваться в консалтинге :-)

на мой взгляд оба примера неправильны
в первом примере - чтобы взять первый элемент массива нужно знать размер элемента - размера вообще нет, поэтому ошибка

во втором примере в строке нет кодировки
размер одного элемента может быть 1 байт или 2 байта как в Юникод или даже 5 байтов как в UTF8
строка без кодировки бессмысленна
надо явно задать кодировку Юникод
вот так
char p[] = L"TTTTTTTTTTTTTTTTTTTT";


-----------




For the latest version of CityDesk, the web site management software published by my company, we decided to do everything internally in UCS-2 (two byte) Unicode, which is what Visual Basic, COM, and Windows NT/2000/XP use as their native string type. In C++ code we just declare strings as wchar_t ("wide char") instead of char and use the wcs functions instead of the str functions (for example wcscat and wcslen instead of strcat and strlen). To create a literal UCS-2 string in C code you just put an L before it as so: L"Hello".

http://www.joelonsoftware.com/articles/Unicode.html
...
Рейтинг: 0 / 0
C++
    #34111665
Oleg_2006Мой пример - это чистое воспроизведение ситуации, и я с вами согласен,
однако по ходу решения задачи мне необходимо модифицировть текст.
не проходит и следующее

int fx()
{
char *p = { UUUUUUuu};
p[0]='L';
Ты так и не понял, что тебе сказали! Объясняю популярно:

В случае char *p="...."; у тебя имеется некая константа ("..."), к которой ты получаешь доступ через указатель (*р). А КОНСТАНТЫ МЕНЯТЬ НЕЛЬЗЯ!!!

В случае char p[]="...."; у тебя образуется переменная (строковый массив), к которой ты получаешь доступ через указатель (*р). А ПЕРЕМЕННЫЕ МЕНЯТЬ МОЖНО!!!
...
Рейтинг: 0 / 0
C++
    #34111672
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kvasov k> в первом примере - чтобы взять первый элемент массива
k> нужно знать размер элемента - размера вообще нет, поэтому
k> ошибкаты с пассалем не попутал, а ? :)
kvasov k> во втором примере в строке нет кодировки
k> размер одного элемента может быть 1 байт или 2 байта как в
k> Юникод или даже 5 байтов как в UTF8 строка без кодировки
k> бессмысленна надо явно задать кодировку Юникод
k> вот так
k> char p[] = L"TTTTTTTTTTTTTTTTTTTT";не уверен - не обгоняй

скорее всего в вижуале есть защита от записи в статическую память
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
C++
    #34111723
kvasov Oleg_2006Я не много умею писать программы на С++, MFC-6.0
Поясните ржавому чайнику:
char *p = "TTTTTTTTTTTTTTTTTTTT";
int fx()
{
p[0]='X';
Программа валится Здесь!!
...........


char p[] = "TTTTTTTTTTTTTTTTTTTT";
int fx()
{
p[0]='X';
Все на месте !!
...........
Извините за нелепый вопрос, благодарю за ответ!


позвольте вставить свое "ква"
пока в С не написал ни строчки, решил пока тренироваться в консалтинге :-)

на мой взгляд оба примера неправильны
в первом примере - чтобы взять первый элемент массива нужно знать размер элемента - размера вообще нет, поэтому ошибка

во втором примере в строке нет кодировки
размер одного элемента может быть 1 байт или 2 байта как в Юникод или даже 5 байтов как в UTF8
строка без кодировки бессмысленна
надо явно задать кодировку Юникод
вот так
char p[] = L"TTTTTTTTTTTTTTTTTTTT";

-----------

"Иногда лучше жевать чем говорить"(с)
Да, размер буквы ( в зависимости от кодировки) может быть и один байт, и два байта. Но ТИП ДАННЫХ char имеет размер ОДИН БАЙТ .
Идите, учите матчасть...
...
Рейтинг: 0 / 0
C++
    #34111812
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С kvasov Oleg_2006Я не много умею писать программы на С++, MFC-6.0
Поясните ржавому чайнику:
char *p = "TTTTTTTTTTTTTTTTTTTT";
int fx()
{
p[0]='X';
Программа валится Здесь!!
...........


char p[] = "TTTTTTTTTTTTTTTTTTTT";
int fx()
{
p[0]='X';
Все на месте !!
...........
Извините за нелепый вопрос, благодарю за ответ!


позвольте вставить свое "ква"
пока в С не написал ни строчки, решил пока тренироваться в консалтинге :-)

на мой взгляд оба примера неправильны
в первом примере - чтобы взять первый элемент массива нужно знать размер элемента - размера вообще нет, поэтому ошибка

во втором примере в строке нет кодировки
размер одного элемента может быть 1 байт или 2 байта как в Юникод или даже 5 байтов как в UTF8
строка без кодировки бессмысленна
надо явно задать кодировку Юникод
вот так
char p[] = L"TTTTTTTTTTTTTTTTTTTT";

-----------

"Иногда лучше жевать чем говорить"(с)
Да, размер буквы ( в зависимости от кодировки) может быть и один байт, и два байта. Но ТИП ДАННЫХ char имеет размер ОДИН БАЙТ .
Идите, учите матчасть...
минимально адресуемую ячейку ?
...
Рейтинг: 0 / 0
C++
    #34112019
JibSkeart
минимально адресуемую ячейку ?
Не знаю... Единственное, что я нашел:
/***
*limits.h - implementation dependent values
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* Contains defines for a number of implementation dependent values
* which are commonly used in C programs.
* [ANSI]
*
* [Public]
*
****/
...
#define CHAR_BIT 8 /* number of bits in a char */
....
...
Рейтинг: 0 / 0
C++
    #34112087
kvasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав СДа, размер буквы ( в зависимости от кодировки) может быть и один байт, и два байта. Но ТИП ДАННЫХ char имеет размер ОДИН БАЙТ .
Идите, учите матчасть...

тогда автор программы пусть не обманывается, что он записал букву "Х"
он записал цифру, а букву под этой цифрой юзер может прочитать совсем другую

p[0]='X' - лукавый путь

почему бы ему не написать так
p[0]=0x100

раз смысла нет, то пусть его и не будет
...
Рейтинг: 0 / 0
C++
    #34112121
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С JibSkeart
минимально адресуемую ячейку ?
Не знаю... Единственное, что я нашел:
/***
*limits.h - implementation dependent values
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* Contains defines for a number of implementation dependent values
* which are commonly used in C programs.
* [ANSI]
*
* [Public]
*
****/
...
#define CHAR_BIT 8 /* number of bits in a char */
....

Ну по умолчанию да, char имеет один байт , но это же при желании можно изменить. :)
...
Рейтинг: 0 / 0
C++
    #34112523
Oleg_2006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С спосибо за помощь, я могу согласиться с Вами, что
char *p= " .. " и char p[]= " .. ";
разные вещи , но защита от изменений в С++ реализуется соответствующей декларацией.
и проверяется на уровне трансляции.
Описание Static это не защита от изменей.
Пример
f()
{ char *p= " .......";
p[0]='.'; // Это валиться
.....
все будет размещено в СТЕКЕ и причем здесь
< есть защита от записи в статическую память>
...
Рейтинг: 0 / 0
C++
    #34112977
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_2006 O> f()
O> { char *p= " .......";
O> p[0]='.'; // Это валиться
O> .....
O> все будет размещено в СТЕКЕ и причем здесь
O> < есть защита от записи в статическую память>с чего ты взял, что " ......." будет в стеке ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
C++
    #34113159
Oleg_2006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю всех прокомментировавших мой вопрос. Вы правы
char *p = " mnnbb" ;
- формируется константый указатель и не следует его использовать для модификации. Только вылетает программа странно - рушится даже студия. Это я хотел использовать для инициализации
некоторой весьма не простой структуры, которая служит информационной базой при генерации предложения SELECT языке SQL. Эту неприятность можно преодалеть. Еще раз благодарю всех за помощь.
...
Рейтинг: 0 / 0
C++
    #34114723
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще странно, но :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int main ()
{
char *p = "TTT";
p[ 0 ]='A';
char p1[] = "TTT";
p1[ 0 ]='B';

cout<<p<<"\n";
cout<<p1;
int yu;
cin>>yu;

return  0 ;
}

компилит, запускает. работает без ошибок, но вывод такой:
Код: plaintext
1.
TTT
BTT
Среда VS 2005
...
Рейтинг: 0 / 0
C++
    #34114739
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bemtaillвообще странно, но :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int main ()
{
char *p = "TTT";
p[ 0 ]='A';
char p1[] = "TTT";
p1[ 0 ]='B';

cout<<p<<"\n";
cout<<p1;
int yu;
cin>>yu;

return  0 ;
}

компилит, запускает. работает без ошибок, но вывод такой:
Код: plaintext
1.
TTT
BTT
Среда VS 2005

В зависимости от реализации. С большой долей уверености g++ выдаст Segmentaion fails
...
Рейтинг: 0 / 0
C++
    #34114849
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh bemtaillвообще странно, но :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int main ()
{
char *p = "TTT";
p[ 0 ]='A';
char p1[] = "TTT";
p1[ 0 ]='B';

cout<<p<<"\n";
cout<<p1;
int yu;
cin>>yu;

return  0 ;
}

компилит, запускает. работает без ошибок, но вывод такой:
Код: plaintext
1.
TTT
BTT
Среда VS 2005

В зависимости от реализации. С большой долей уверености g++ выдаст Segmentaion fails

В Билдере результат :)
АТТ
ВТТ
...
Рейтинг: 0 / 0
C++
    #34115222
bemtaill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JibSkeart Akh bemtaillвообще странно, но :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int main ()
{
char *p = "TTT";
p[ 0 ]='A';
char p1[] = "TTT";
p1[ 0 ]='B';

cout<<p<<"\n";
cout<<p1;
int yu;
cin>>yu;

return  0 ;
}

компилит, запускает. работает без ошибок, но вывод такой:
Код: plaintext
1.
TTT
BTT
Среда VS 2005

В зависимости от реализации. С большой долей уверености g++ выдаст Segmentaion fails

В Билдере результат :)
АТТ
ВТТ


A вот это уже совсем беспредел:))
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]