| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > sizeof("123456")= ? |
| Автор: jonie 15.3.2008, 14:36 | ||
простой вопрос: что будет на консоли ?
вопрос сложнее : что покажет дебаггер VS2005\VS2008 ? http://ipicture.ru/ вопрос самый сложный : почему и как должно быть ?) (я уже начал сомневаться в майкрософт).... |
| Автор: Alek86 15.3.2008, 14:49 |
11 будет расшифровую - sizeof статического массива == колво элементов * размер элементов а строка "123456789" содержит 10 элементов (+ '\0') |
| Автор: vadiml 15.3.2008, 14:51 |
| sizeof("123456789")+1 нормальный компилятор должен дать 11 а что такого появилось в VC, а то я им с 6й версии не пользовался |
| Автор: Fin 15.3.2008, 14:55 |
| 9 символьных знаков + нуль-терминал + 1 итого 11. Скорее всего дебагер считает размер ссылки на строку, которая и есть 4 байта. |
| Автор: jonie 15.3.2008, 14:57 |
| Alek86 ну это был простой вопрос) а вот отладчик (См. скриншет) так не считает )) это баг или фича ? <- этот вопрос интереснее. |
| Автор: Alek86 15.3.2008, 15:12 |
| ты бы выделил... дурной отладчик, значит |
| Автор: vinter 15.3.2008, 16:13 |
| дебагер 2008 покажет 11 |
| Автор: jonie 15.3.2008, 16:45 | ||
а скриншет выше с какой по-твоему сделан ?
вот конкретно с этой. |
| Автор: Alek86 15.3.2008, 17:25 |
| 2005 тоже 4 показывает - можешь на мелких бочку накатить кстати, тема ближе к ветке Visual C++/MFC/WTL и к чистым сям не относится... |
| Автор: vinter 15.3.2008, 21:33 |
значит у тя кривая студия ;)![]() |
| Автор: korian 15.3.2008, 21:41 |
| причем тут студия у него sizeof в watch'е а переменную "123456789", можно рассматривать 2-я вариантами: 1) const char a[] = "123456789"; 2) const char* b = "123456789"; т.к. первый вариант - это константа, имху смысла в watch'е он не имеет, имху поэтому выбирается второй вариант. уверен, что sizeof(a) в watch'е, при первом варианте покажет 10. |
| Автор: jonie 15.3.2008, 22:01 |
| наверно я идиот, но не вижу на твоем скриншете в watch-ах ничего похожего на sizeof("21343242"); я не вижу "две одинаковые студии(разные издания) показывают по разному" этого |
| Автор: baldina 15.3.2008, 22:57 | ||||
| Вычислятель в окошке watch имеет некоторые ограничения (большинство описано msdn), так что наивно от него ожидать некоторых вещей. В частности, для "123456" watch покажет тип char* и значение 0x00000. Это представляется логичным, т.к. эта строка не принадлежит отлаживаемой программе. vinter,
пошевели, в чьем Text Segment она лежит? и с какого момента? и причем тут студия?
это какие? все мои одинаково. я чего-то пропустил? |
| Автор: vinter 15.3.2008, 23:15 |
| jonie, сорри это я ступил првел пару экспериментов, так вот непонятно что в этом случае показывает дебагер, но это не размер указателя, так как при х64 сборке, он все равно остается 4..хотя другие указатели как положено, показываються размером в 8 байт.. Пусть будет глюк, он в принципе не существенный, т.к в реальной ситуации это никак не воспроизводится(чтобы помешать по крайней мере) Добавлено через 7 минут и 49 секунд чем? в своем разные компиляторы делают по разному, например Borland Builder 6.0 не помещает конст. строку в Text Segment |
| Автор: baldina 15.3.2008, 23:35 | ||
| не пошевелил :(. Text Segment здесь непричем, т.к. речь вообще не про компилятор, а про некоторую фичу в отладчике. А константы, что мы вводим в отладчике, не только не являеются частью программы, но и не являются статическими данными: мы их только что ввели, и отладчик (не программа!) распределил для них память динамически. Добавлено через 6 минут и 4 секунды
попробую телепатию. у тебя приложение получается 64-битное, а отладчик - 32х битный. Так вот он и показывает указатели приложения 8байт, а свои - 4. |
| Автор: vinter 15.3.2008, 23:50 | ||||
читай внимательнее, про TS я написал в ответе на конкретную цитату.
это как? не я не спорю, может ты и прав. Где можно посмотреть скольки битный отладчик используется? хотя что-то я сильно сомневаюсь что 32 битным отладчиком, можно дебажить 64 разрядные приложения.. |
| Автор: MAKCim 16.3.2008, 10:21 | ||
а в чем проблема? то, что это несколько противоестественно - да технических же проблем я не вижу для реализации отладчика необходим дизассемблер и соответствующая поддержка в ядре ОС, нативная, либо в виде модуля (которая заключается прежде всего в реализации возможности чтения/записи данных из/в адресного пространства отладочного процесса и регистров) 32-х битный дизассемблер 64-х битного кода реализуется элементарно, потому что это логика, а любую логику можно эмулировать програмно в любом окружении (как пример, полная эмуляция 64-х битного режима в 32-х разрядном Bochs) |
| Автор: jonie 16.3.2008, 13:43 |
| в общем считаем баг фичей. самое фиговое, если подумать вовсе не watch-и... а то что всплывает при наведении на sizeof непосредственно (там тоже 4). Если вы используете сложные вычисления с использованием подобного кода и неуверены в них, то это может стать довольно немаленькой проблемой..... просто надо помнить и знать) ну и по возможности не использовать такой код 8)) |