|
|
|
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
|
|||
|---|---|---|---|
|
#18+
Всем доброе время суток Помогите разъяснить ситуацию со строковыми массивами есть массивы: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. Вопрос в следующем имя массива есть указатель на его первый адрес и в случае с int это подтверждается, но как определяется граница строкового массива? В случае со строкой наверное по символу '\0' в если его нет? и почему у двух символьных массивов chnmarray и charray разные значения в отладчике? И если не сложно просветите как располагаются символьные массивы в памяти, поскольку в книгах этот вопрос опускается, за исключением нескольких аспектов: все элементы располагаются последовательно, имя массива является адресом, строка сама есть адрес своего местоположения(тоже не понятно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2006, 13:26 |
|
||
|
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
|
|||
|---|---|---|---|
|
#18+
В книгах четко написано, что в С/С++ строки оканчиваются нулевым байтом. Если бы у тебя после байтов 's','d' или 'a','b','c' в массивах chnmarray и charray нулевые байты были подальше, то строки вывелись подлиннее :)) тебе просто повезло. Если ты хочешь, чтобы компилятор сформировал строку с нулевым байтом в конце, то определяй строку так: Код: plaintext Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2006, 13:31 |
|
||
|
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
|
|||
|---|---|---|---|
|
#18+
Уважаемый Карабас Барбарас уточняю для личного понимания: т.е. отладчик в данном случае показывает строку до нулевого символа? независимо от того массив символов это или строка. И следовательно при просмотре типа char среда разработки не обращается внимание на то, есть в конце строки символ окончания строки или нет и выводит в окно отладки все подряд? тоже самое происходит с указателями *char ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2006, 13:38 |
|
||
|
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
|
|||
|---|---|---|---|
|
#18+
Я так думаю (ИМХО), что для отладчика, как и для компилятора, char[] и char* - одно и то же. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2006, 13:47 |
|
||
|
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
|
|||
|---|---|---|---|
|
#18+
Спасибо за помощь Уж виден свет в конце тунеля..... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2006, 14:02 |
|
||
|
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
|
|||
|---|---|---|---|
|
#18+
Карабас БарабасЯ так думаю (ИМХО), что для отладчика, как и для компилятора, char[] и char* - одно и то же. Posted via ActualForum NNTP Server 1.3 Может и одно и тоже, но способ размещения будет разный: так char s[]="123424knvkxdjf"; в стеке, а так char *s="123424knvkxdjf"; - х.з. где, может даже в read-only сегменте. Поэтому во втором случае, строку не рекомендуется изменять - под Виндой может и прокатит, а под Линукс SIGSEGV обеспечен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 09:37 |
|
||
|
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
|
|||
|---|---|---|---|
|
#18+
АлексейВопрос в следующем имя массива есть указатель на его первый адрес и в случае с 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" в выражение подставить адрес первого элемента этого массива. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 10:19 |
|
||
|
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
|
|||
|---|---|---|---|
|
#18+
MasterZiv А что показывает конкретно ваш отладчик я например вообще не понимаю. Что там за буква M такая, откуда она взялась ? Буква М в отладчике символизирует мусор (ну, по крайней мере так происходит у меня в WinXP + MS VC++6). Так, если я выделил область памяти под строковую переменную, то при просмотре под отладчиком я всегда вижу эти "MMM...MMM"... Естественно, что когда я вставляю '\0' в эту область памяти, то под отладчиком вижу только ту часть строки, которая заканчивается '\0'... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 10:42 |
|
||
|
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
|
|||
|---|---|---|---|
|
#18+
в С, С++ масив строк Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 12:14 |
|
||
|
Знающие помогите не знающему с массивами ( очень давно мучаюсь)
|
|||
|---|---|---|---|
|
#18+
char d*= "sfd" это вообще акракадабра, так как *d это объявление указателя и присваивать ему адрес "sfd" УЖАС! чтобы такой указатель указывал на масив необходимо сначала выделить память new(malloc) d = new char[strlen("asdf") + 1/*на нуль символ*/]; Сие есть бред. char *d = "sfd"; - нормальное объявление указателя и инициализация его значением (другим указателем). Правда хороший компилятор пожалуется, что d - не const и попросит написать так: const char *d = "sfd"; Но если это код на С, а не на С++, то ничего такого он делать не попросит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 18:08 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=371&tid=2031945]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
72ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 260ms |
| total: | 450ms |

| 0 / 0 |
