Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Доброго времени суток. Разбираюсь с указателями на void.
Для обучения создал следующий код:

Код: Выделить всё

	void *ptr = "Hello, world";
	printf("%s", (char*)ptr);
Компиляция проходит гладко, вижу свою заветную строку.
Решаю провести эксперимент - удаляю приведение указателя к char: printf("%s", ptr)
Компилирую, ожидаю увидеть ошибку, но нет, все проходит успешно, опять вижу заветную строку. Это норма ? Дело в том, что я вывожу через спецификатор %s, и оно все равно приводится к char ?
Последний раз редактировалось Пока_без_кота Пн мар 04, 2019 21:10:40, всего редактировалось 1 раз.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Но так делать "аяяай, низзя" ? Или просто некрасиво ?
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3582757#p3582757"]Компилирую, ожидаю увидеть ошибку, но нет, все проходит успешно, опять вижу заветную строку. Это норма ?[/uquote]
Да. Спецификатор %s указывет функции printf на то, что ей параметром передается указатель на строку. Так она его и интерпретирует. Хоть в указатель на int его преобразуйте - от этого его содержимое не изменится.
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Благодарю.
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Тут надо понимать одно - любой указатель, неважно на что указывающий, имеет одну ширину памяти. А void* - универсальный указатель, для каких-либо промежуточных результатов. Либо для неизвестного типа.
И, что самое интересное. В функциях void означает "пустоту". Ничто. ... А вот указатель на void допустим. Когнитивный диссонанс какой-то получается. Особенно у новичков :)))
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3582766#p3582766"]Но так делать "аяяай, низзя" ? Или просто некрасиво ?[/uquote]
некрасиво делать void* str = "fgfgf";
и вообще, обилие явных приведений типов в программе настораживает...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

в чем смысл использования отдельного стека данных? многие компиляторы отводят под это дело кусочек ОЗУ... а почему не использовать общий стек? вопрос в контексте микроконтроллеров, у которых нет "разных" ОЗУ и нет защиты блоков ОЗУ от доступа "чужих" процессов.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Вы бы привели конкретный пример. Потому что почти все компиляторы выделяют весь стек в отдельный сегмент, для возможности управления им редактором связей (linker). А вот чтобы какой-то компилятор выделал отдельные сегменты для стека вызовов и стека данных я даже припомнить не могу.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Изображение
что вот это за DATA STACK?
Изображение
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3583922#p3583922"]что вот это за DATA STACK?[/uquote]Да там один стек. В чём можно убедиться посмотрев типовой IAR AVR .map для таких настроек
Изображение
Спойлер

Код: Выделить всё

SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
INTVEC               CODE          00000000 - 00000083          84   com    1
?FILL1               CODE          00000084 - 0000008B           8   rel    0
DIFUNCT              CODE          0000008C - 0000008D           2   rel    0
CODE                 CODE          0000008E - 00001285        11F8   rel    1
INITTAB              CODE          00001286 - 00001293           E   rel    0
NEAR_ID              CODE          00001294 - 000012A5          12   rel    0
REGVAR_AN            DATA          0000000E - 0000000F           2   rel    0
ABSOLUTE             DATA               0000001C                     rel    0
                     DATA               0000001D                   
                     DATA               0000001E                   
                     DATA               0000001F                   
                     DATA          00000022 - 00000028           7 
                     DATA          0000002D - 0000002D           1 
                     DATA          0000002F - 0000002F           1 
                     DATA          00000031 - 0000003B           B 
                     DATA          00000044 - 00000045           2 
                     DATA          00000048 - 0000004B           4 
                     DATA          0000004E - 0000004F           2 
                     DATA          00000054 - 00000054           1 
                     DATA          00000056 - 00000057           2 
                     DATA          00000061 - 00000062           2 
                     DATA          00000098 - 0000009D           6 
CSTACK               DATA          00000100 - 0000017F          80   dse    0
RSTACK               DATA          00000180 - 000001BF          40   dse    0
NEAR_I               DATA          000001C0 - 000001D1          12   rel    0
NEAR_Z               DATA          000001D2 - 0000021D          4C   rel    0
EEPROM_I             XDATA              00000000                     dse    0
EEPROM_N             XDATA         00000000 - 0000000C           D   rel    0
AVR_STACK.png
(15.76 КБ) 411 скачиваний
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

что значит один, если четным по серому написано DATA STACK и RETURN ADRESS STACK?
к тому же я вопрос задал после того, как столкнуля именно с ДВУМЯ стеками на практике: параметры функций загоняются в стек данных через указатель, а call-ы и ret-ы, естественно, адресуются через SP, как обычно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Согласен, такую реализацию можно считать двумя стеками. Я думаю, это для совместимости с амёбами с фиксированным аппаратным стеком.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

если брать IAR, то разве он для младшеньких PIC-ов существует? а аппаратный стек вроде как больше нигде не присутствует... по-моему, еще у AT90S1200 или какого-то подобного "безОЗУшного"... ну так для таких "амеб" и Си применять - верх безрассудства. как-то странно все это...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Честно говоря, про амёб уже плохо помню, AVR-ки только на сопровождении старых проектов остались. Так то доводов в пользу такого подхода много можно придумать. Например, оптимизиция может лучше работать. Но это только программеры из IAR нам смогут рассказать.
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Могу предположить, что это имеет смысл для архитектур памяти, подобных 16-битному режиму x86, в котором один сегмент стека не может превышать 64К. Тогда два сегмента удваивают этот лимит.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я могу предположить много чего, но как эти сегменты увязаны с IAR для AVR или CodeVision?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Да никак. По умолчанию тихо мирно рядом лежат. При необходимости их можно легко растащить по разным сегментам памяти. Заподозрить IAR-овцев в некомпетентности трудно. Сделали так, значит так лучше. Может так удобней для их "stack usage analysis", например.
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

[uquote="ARV",url="/forum/viewtopic.php?p=3583992#p3583992"]я могу предположить много чего, но как эти сегменты увязаны с IAR для AVR или CodeVision?![/uquote]
Да никак. Какой смысл писать отдельные продукты для разных архитектур, если можно иметь общий продукт и разные только кодогенераторы? Если желательно иметь такое разделение стеков для того же CompactRISC (CR16C), то какой смысл ограничивать данный функционал только этой архитектурой?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3584046#p3584046"]Какой смысл писать отдельные продукты для разных архитектур,[/uquote]Ну это вообще не довод. IAR поддерживает множество архитектур и ко всем с одним подходом нельзя. Только на ARM я видел от одного до пяти стеков на разных ядрах.
Ответить

Вернуться в «Разные вопросы по МК»