powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Знающие помогите не знающему с массивами ( очень давно мучаюсь)
10 сообщений из 10, страница 1 из 1
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
    #33539454
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброе время суток

Помогите разъяснить ситуацию со строковыми массивами

есть массивы:

Код: plaintext
1.
2.
3.
4.
int array [] = { 10 , 20 , 30 };
char chnmarray[] = {'s','d'};
char charray[] = {'a','b','c'};
char chnarray[] = {'s','d','\0'};
Если посмотреть их в отладчике получается следующая картина
Код: plaintext
1.
2.
3.
4.
array	0x0012ff70
chnmarray 0x0012ff6c "sdМ"
charray	0x0012ff68 "abcМsdМ"
chnarray	0x0012ff64 "sd"

Вопрос в следующем имя массива есть указатель на его первый адрес и в случае с int это подтверждается, но как определяется граница строкового массива? В случае со строкой наверное по символу '\0' в если его нет? и почему у двух символьных массивов chnmarray и charray разные значения в отладчике? И если не сложно просветите как располагаются символьные массивы в памяти, поскольку в книгах этот вопрос опускается, за исключением нескольких аспектов: все элементы располагаются последовательно, имя массива является адресом, строка сама есть адрес своего местоположения(тоже не понятно).
...
Рейтинг: 0 / 0
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
    #33539455
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В книгах четко написано, что в С/С++ строки оканчиваются нулевым байтом.
Если бы у тебя после байтов 's','d' или 'a','b','c' в массивах chnmarray и charray нулевые байты были подальше, то строки вывелись подлиннее :)) тебе просто повезло.

Если ты хочешь, чтобы компилятор сформировал строку с нулевым байтом в конце, то определяй строку так:

Код: plaintext
  char *s="123424knvkxdjf";

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
    #33539460
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Карабас Барбарас уточняю для личного понимания:
т.е. отладчик в данном случае показывает строку до нулевого символа? независимо от того массив символов это или строка. И следовательно при просмотре типа char среда разработки не обращается внимание на то, есть в конце строки символ окончания строки или нет и выводит в окно отладки все подряд? тоже самое происходит с указателями *char ?
...
Рейтинг: 0 / 0
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
    #33539465
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так думаю (ИМХО), что для отладчика, как и для компилятора, char[] и char* - одно и то же.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
    #33539471
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за помощь
Уж виден свет в конце тунеля..... :)
...
Рейтинг: 0 / 0
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
    #33539962
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас БарабасЯ так думаю (ИМХО), что для отладчика, как и для компилятора, char[] и char* - одно и то же.
Posted via ActualForum NNTP Server 1.3
Может и одно и тоже, но способ размещения будет разный:
так char s[]="123424knvkxdjf"; в стеке, а так char *s="123424knvkxdjf"; - х.з. где, может даже в read-only сегменте. Поэтому во втором случае, строку не рекомендуется изменять - под Виндой может и прокатит, а под Линукс SIGSEGV обеспечен.
...
Рейтинг: 0 / 0
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
    #33540048
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейВопрос в следующем имя массива есть указатель на его первый адрес и в случае с int это подтверждается, но как определяется граница строкового массива?


Это на самом деле не так. переменная типа "массив элементов Т" автоматически приводится компилятором к типу "указатель на элемент Т"
путем взятия адреса первого элемента массива (это в С++).

Граница массива a определяется как a[0] + sizeof(a)/sizeof(a[0]).

В случае со строкой наверное по символу '\0' в если его нет?

Это- не граница массива, это граница строки. Это разные вещи.
Граница массива - это адреса, в которых располагается С++ -ный объект
типа массив. А граница строки - это то, что возвратит strlen(). Это не всегда совпадает.

и почему у двух символьных массивов chnmarray и charray разные значения в отладчике?

Это на совести отладчика. Обычно отладчик показывает указатели на char как символьные ASCIZ строки, и также символьные массивы. Хотя наверное это можно менять какими-то опциями. Вообще, отладчик - это же не компилятор, правда ?
А что показывает конкретно ваш отладчик я например вообще не понимаю. Что там за буква M такая, откуда она взялась ?

И если не сложно просветите как располагаются символьные массивы в памяти,

Последовательно от первого символа в младшем адресе до последнего символа
в старшем.

поскольку в книгах этот вопрос опускается, за исключением нескольких аспектов: все элементы располагаются последовательно, имя массива является адресом,

Кажется по стандарту С++ имя массива не является адресом. Но приводится к нему. Например :
int a[200];
assert( sizeof(a) != sizeof(&a) )

строка сама есть адрес своего местоположения (тоже не понятно).

Если вы имеете в виду строковую константу, типа как в:
strcat( a, "A quick brown fox jumps over the lazy dog" );

То для компилятора "A quick brown fox jumps over the lazy dog" является
инструкцией выделить в статической памяти массив размером
strlen( "A quick brown fox jumps over the lazy dog" ) + 1,
поместить туда эту строку и в конец добавить символ '\0'.
А вместо "A quick brown fox jumps over the lazy dog" в выражение подставить адрес первого элемента этого массива.
...
Рейтинг: 0 / 0
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
    #33540098
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
А что показывает конкретно ваш отладчик я например вообще не понимаю. Что там за буква M такая, откуда она взялась ?

Буква М в отладчике символизирует мусор (ну, по крайней мере так происходит у меня в WinXP + MS VC++6).
Так, если я выделил область памяти под строковую переменную, то при просмотре под отладчиком я всегда вижу эти "MMM...MMM"...
Естественно, что когда я вставляю '\0' в эту область памяти, то под отладчиком вижу только ту часть строки, которая заканчивается '\0'...
...
Рейтинг: 0 / 0
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
    #33540434
Гадёныш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в С, С++ масив строк

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int array [] = { 10 , 20 , 30 };
 /* нет нулевого символо, но масив создаётся на 2 елемента... если использовать как строку, то вылет програмы почти обеспечен
чтобы посмотреть в отладчике код анси нужно к переменной добавить ",d"

и имя масива это УКАЗАТЕЛЬ!
при статическом выделении те d[10] это статический указатель, и показывает на первый елемент масива, но изменять его нельзя
char d*= "sfd" это вообще акракадабра, так как *d это объявление указателя 
и присваивать ему адрес "sfd" УЖАС! чтобы такой указатель указывал на масив необходимо сначала выделить память new(malloc) 
d = new char[strlen("asdf") + 1/*на нуль символ*/];
потом уже strcpy(d,"asdf");
delete []d;
*/
char chnmarray[] = {'s','d'};
char charray[] = {'a','b','c'};
char chnarray[] = {'s','d','\0'};
...
Рейтинг: 0 / 0
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
    #33541701
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
char d*= "sfd" это вообще акракадабра, так как *d это объявление указателя
и присваивать ему адрес "sfd" УЖАС! чтобы такой указатель указывал на масив необходимо сначала выделить память new(malloc)
d = new char[strlen("asdf") + 1/*на нуль символ*/];

Сие есть бред.
char *d = "sfd";
- нормальное объявление указателя и инициализация его значением (другим указателем). Правда хороший компилятор пожалуется, что d - не const и
попросит написать так:

const char *d = "sfd";

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


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