Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > sizeof("123456")= ?


Автор: jonie 15.3.2008, 14:36
простой вопрос: что будет на консоли ?
Код

    int a = sizeof("123456789")+1;
    printf("%d\n", a);


вопрос сложнее : что покажет дебаггер VS2005\VS2008 ?
http://ipicture.ru/

вопрос самый сложный : почему и как должно быть ?)  (я уже начал сомневаться в майкрософт)....


Автор: Alek86 15.3.2008, 14:49
Цитата(jonie @  15.3.2008,  14:36 Найти цитируемый пост)
простой вопрос: что будет на консоли ?

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
а скриншет выше с какой по-твоему сделан ?
Код

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5

Installed Edition: Enterprise

Microsoft Visual Basic 2008   91899-270-4240882-60012
Microsoft Visual Basic 2008

Microsoft Visual C# 2008   91899-270-4240882-60012
Microsoft Visual C# 2008

Microsoft Visual C++ 2008   91899-270-4240882-60012
Microsoft Visual C++ 2008

Microsoft Visual Studio 2008 Tools for Office   91899-270-4240882-60012
Microsoft Visual Studio 2008 Tools for Office

Microsoft Visual Studio Team System 2008 Architecture Edition   91899-270-4240882-60012
Microsoft Visual Studio Team System 2008 Architecture Edition

Microsoft Visual Studio Team System 2008 Database Edition   91899-270-4240882-60012
Microsoft Visual Studio Team System 2008 Database Edition

Microsoft Visual Studio Team System 2008 Development Edition   91899-270-4240882-60012
Microsoft Visual Studio Team System 2008 Development Edition

Portions of International CorrectSpell™ spelling correction system © 1993 by Lernout & Hauspie Speech Products N.V.  All rights reserved.

The American Heritage® Dictionary of the English Language, Third Edition Copyright © 1992 Houghton Mifflin Company.  Electronic version licensed from Lernout & Hauspie Speech Products N.V.  All rights reserved.


Microsoft Visual Studio Team System 2008 Test Edition   91899-270-4240882-60012
Microsoft Visual Studio Team System 2008 Test Edition

Microsoft Visual Web Developer 2008   91899-270-4240882-60012
Microsoft Visual Web Developer 2008

Crystal Reports    AAJ60-G0MSA4K-68000CF
Crystal Reports Basic for Visual Studio 2008


Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB944899)   KB944899
This hotfix is for Microsoft Visual Studio Team System 2008 Team Suite - ENU.
If you later install a more recent service pack, this hotfix will be uninstalled automatically.
For more information, visit http://support.microsoft.com/kb/944899.

Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB945282)   KB945282
This hotfix is for Microsoft Visual Studio Team System 2008 Team Suite - ENU.
If you later install a more recent service pack, this hotfix will be uninstalled automatically.
For more information, visit http://support.microsoft.com/kb/945282.

Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB946040)   KB946040
This hotfix is for Microsoft Visual Studio Team System 2008 Team Suite - ENU.
If you later install a more recent service pack, this hotfix will be uninstalled automatically.
For more information, visit http://support.microsoft.com/kb/946040.

Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB946308)   KB946308
This hotfix is for Microsoft Visual Studio Team System 2008 Team Suite - ENU.
If you later install a more recent service pack, this hotfix will be uninstalled automatically.
For more information, visit http://support.microsoft.com/kb/946308.

Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB946344)   KB946344
This hotfix is for Microsoft Visual Studio Team System 2008 Team Suite - ENU.
If you later install a more recent service pack, this hotfix will be uninstalled automatically.
For more information, visit http://support.microsoft.com/kb/946344.

Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB946581)   KB946581
This hotfix is for Microsoft Visual Studio Team System 2008 Team Suite - ENU.
If you later install a more recent service pack, this hotfix will be uninstalled automatically.
For more information, visit http://support.microsoft.com/kb/946581.

Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB947171)   KB947171
This hotfix is for Microsoft Visual Studio Team System 2008 Team Suite - ENU.
If you later install a more recent service pack, this hotfix will be uninstalled automatically.
For more information, visit http://support.microsoft.com/kb/947171.

Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB947173)   KB947173
This hotfix is for Microsoft Visual Studio Team System 2008 Team Suite - ENU.
If you later install a more recent service pack, this hotfix will be uninstalled automatically.
For more information, visit http://support.microsoft.com/kb/947173.

Hotfix for Microsoft Visual Studio Team System 2008 Team Suite - ENU (KB947789)   KB947789
This hotfix is for Microsoft Visual Studio Team System 2008 Team Suite - ENU.
If you later install a more recent service pack, this hotfix will be uninstalled automatically.
For more information, visit http://support.microsoft.com/kb/947789.

SourceOutliner   1.0
Creates a tool window that provides an outline view of a source code file.

Visual Assist X   
For more information about Visual Assist X, see the Whole Tomato Software website at http://www.WholeTomato.com. Copyright (c) 1997-2007 Whole Tomato Software, Inc.

Xoreax IncrediBuild   3.10 (build 822)
Xoreax IncrediBuild 3.10 (build 822)

вот конкретно с этой.

Автор: Alek86 15.3.2008, 17:25
2005 тоже 4 показывает - можешь на мелких бочку накатить smile

кстати, тема ближе к ветке Visual C++/MFC/WTL и к чистым сям не относится...

Автор: vinter 15.3.2008, 21:33
значит у тя кривая студия ;)
user posted image

Автор: 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.

Автор: vinter 15.3.2008, 21:51
Цитата(korian @  15.3.2008,  22:41 Найти цитируемый пост)
причем тут студияу него sizeof в watch'еа переменную "123456789", можно рассматривать 2-я вариантами:1) const char a[] = "123456789";2) const char* b = "123456789";

поверь, ты не открыл Америку, только вот две одинаковые студии(разные издания) показывают по разному
Цитата(korian @  15.3.2008,  22:41 Найти цитируемый пост)
т.к. первый вариант - это константа, имху смысла в watch'е он не имеет, имху поэтому выбирается второй вариант.

это в любом случае константа, которая лежит в Text Segment(справедливо для студии)

Автор: jonie 15.3.2008, 22:01
наверно я идиот, но не вижу на твоем скриншете в watch-ах ничего похожего на sizeof("21343242");
я не вижу "две одинаковые студии(разные издания) показывают по разному" этого

Автор: baldina 15.3.2008, 22:57
Вычислятель в окошке watch имеет некоторые ограничения (большинство описано msdn), так что наивно от него ожидать некоторых вещей.
В частности, для "123456" watch покажет тип char* и значение 0x00000.
Это представляется логичным, т.к. эта строка не принадлежит отлаживаемой программе.

vinter, 
Цитата

это в любом случае константа, которая лежит в Text Segment(справедливо для студии) 

пошевели, в чьем Text Segment она лежит? и с какого момента? и причем тут студия?
Цитата

только вот две одинаковые студии(разные издания) показывают по разному

это какие? все мои одинаково. я чего-то пропустил?

Автор: vinter 15.3.2008, 23:15
jonie, сорри это я ступил smile
првел пару экспериментов, так вот непонятно что в этом случае показывает дебагер, но это не размер указателя, так как при х64 сборке, он все равно остается 4..хотя другие указатели как положено, показываються размером в 8 байт.. Пусть будет глюк, он в принципе не существенный, т.к в реальной ситуации это никак не воспроизводится(чтобы помешать по крайней мере)

Добавлено через 7 минут и 49 секунд
Цитата(baldina @  15.3.2008,  23:57 Найти цитируемый пост)
пошевели

чем?
Цитата(baldina @  15.3.2008,  23:57 Найти цитируемый пост)
 в чьем Text Segment она лежит

в своем
Цитата(baldina @  15.3.2008,  23:57 Найти цитируемый пост)
 и причем тут студия?

разные компиляторы делают по разному, например Borland Builder 6.0 не помещает конст. строку в Text Segment

Автор: baldina 15.3.2008, 23:35
не пошевелил :(. Text Segment здесь непричем, т.к. речь вообще не про компилятор, а про некоторую фичу в отладчике. А константы, что мы вводим в отладчике, не только не являеются частью программы, но и не являются статическими данными: мы их только что ввели, и отладчик (не программа!) распределил для них память динамически.

Добавлено через 6 минут и 4 секунды
Цитата
при х64 сборке

попробую телепатию. у тебя приложение получается 64-битное, а отладчик - 32х битный. Так вот он и показывает указатели приложения 8байт, а свои - 4.

Автор: vinter 15.3.2008, 23:50
Цитата(baldina @  16.3.2008,  00:35 Найти цитируемый пост)
Text Segment здесь непричем, т.к. речь вообще не про компилятор, а про некоторую фичу в отладчике

читай внимательнее, про TS я написал в ответе на конкретную цитату.
Цитата(baldina @  16.3.2008,  00:35 Найти цитируемый пост)
попробую телепатию. у тебя приложение получается 64-битное, а отладчик - 32х битный. Так вот он и показывает указатели приложения 8байт, а свои - 4.

это как? smile 
не я не спорю, может ты и прав. Где можно посмотреть скольки битный отладчик используется? хотя что-то я сильно сомневаюсь что 32 битным отладчиком, можно дебажить 64 разрядные приложения..

Автор: MAKCim 16.3.2008, 10:21
Цитата(vinter @  15.3.2008,  23:50 Найти цитируемый пост)
хотя что-то я сильно сомневаюсь что 32 битным отладчиком, можно дебажить 64 разрядные приложения.. 

а в чем проблема?
то, что это несколько противоестественно - да
технических же проблем я не вижу
для реализации отладчика необходим дизассемблер и соответствующая поддержка в ядре ОС, нативная, либо в виде модуля (которая заключается прежде всего в реализации возможности чтения/записи данных из/в адресного пространства отладочного процесса и регистров)
32-х битный дизассемблер 64-х битного кода реализуется элементарно, потому что это логика, а любую логику можно эмулировать програмно в любом окружении (как пример, полная эмуляция 64-х битного режима в 32-х разрядном Bochs)

Автор: jonie 16.3.2008, 13:43
в общем считаем баг фичей.
самое фиговое, если подумать вовсе не watch-и... а то что всплывает при наведении на sizeof непосредственно (там тоже 4). Если вы используете сложные вычисления с использованием подобного кода и неуверены в них, то это может стать довольно немаленькой проблемой..... просто надо помнить и знать) ну и по возможности не использовать такой код 8))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)