Всегда ли sizeof (char *) равен sizeof (double *)?

Небольшие фрагменты кода на C.

#include<stdio.h>

int main()
{
    printf("%zu\n%zu\n", sizeof(char*), sizeof(double*));
}

Вывод: (64-разрядная версия GCC)

8
8

sizeof(char*) всегда равно sizeof(double*)?

Что стандарт C говорит об этом?

Нет такой гарантии. Исторически существовали платформы, на которых указатели на разные объекты могли иметь разный размер (IIRC). Однако в современных системах типа ПК они все одинаковы.   —  person msc    schedule 07.09.2018

Кстати, а почему вы спрашиваете? Простое любопытство или есть какая-то основная проблема, которую нужно решить?   —  person msc    schedule 07.09.2018

Указатель — это указатель — это указатель? Они должны указать где-нибудь в памяти. Если ваши процессоры не хранят разные типы переменных в разных типах памяти, они должны быть идентичными. @Someprogrammerdude IIRC? Вы можете вспомнить, откуда вы это могли вспомнить? Звучит странно, но в свое время были какие-то классные процессоры. Для исторических процессоров OP может запросить на retrocomputing.stackexchange.com   —  person msc    schedule 07.09.2018

Типы @Mawg также могут находиться в одной и той же памяти, но указатели на символы шире, чем указатели на слова, потому что указатели на слово могут опускать несколько наименее значимых битов.   —  person msc    schedule 07.09.2018

Не могли бы вы объяснить это, как пятилетнему ребенку?   —  person msc    schedule 07.09.2018

@Mawg Указатели на слова обычно должны быть выровнены по словам, поэтому в 32-битной системе два младших бита любого указателя на слово будут равны нулю. Количество битов в указателе на слово, которые несут полезную информацию, поэтому меньше, чем количество битов в указателе на байт, которые это делают, и поэтому фактически уже. Я никогда не видел системы, которая пыталась использовать для них другую ширину хранилища!   —  person msc    schedule 07.09.2018

См. также:  Ошибка компилятора пользовательского строкового литерала .. не является переменной

@cooperised Интригующий момент. Энтропия в теории информации указателя на 4-байтовый тип определенно меньше, чем у указателя на однобайтовый тип. Однако разница в размерах этих указателей заключается в битах, а не в байтах. Размер указателя эффективно изменяется только в том случае, если он изменяется более чем на один байт, обычно даже более чем на два байта (1,2,4,8 …). Вы не можете хранить 31-битный указатель в чем-либо другом по размеру, чем 32-битный указатель, по крайней мере, на широко доступных машинах, которые используют память с побайтовой организацией.   —  person msc    schedule 07.09.2018

@Yunnosch: Были компьютеры с памятью, доступной только в многобайтовых единицах слова, в которых собственная адресация на таком компьютере — это просто номер слова в памяти. Байтовые операции должны были быть построены с помощью сдвига и других битовых или арифметических операций. Насколько я помню, в темные времена я слышал, что некоторые реализации C на таком компьютере использовали номер слова для указателей на типы размера слова и использовали номер слова плюс байт в слове для указателей на байты.   —  person msc    schedule 07.09.2018

@Eric Тоже интересно. Правильно ли я понял, что эти реализации будут использовать полноразмерный указатель на слово (не вдаваясь в подробности здесь) плюс отдельная информация о байтах в словах? Отдельно, как нельзя упаковать в одну вещь размером указатель на слово? Если да, то это еще один аргумент в пользу того, чтобы не предполагать, что указатели на все типы одинаковы, даже в пределах одной системы.   —  person msc    schedule 07.09.2018

@SouravGhosh Не могли бы вы пересмотреть свое решение об обмане? Я чувствую, что у этого вопроса есть новый аспект, два указателя (т.е. не один) на разные типы (т.е. не одинаковые) в одной системе. Предлагаемые дубликаты обсуждают гарантии для одного размера указателя (их нет) и различия размеров указателей на один и тот же тип в разных системах (они могут различаться), а также разницу между размером указателя и размером указателя на один и тот же тип ( совсем другое дело, размеры сравнивать бессмысленно). Они не обсуждают в одной системе / реализации, могут ли два указателя быть разного размера? (это мое понимание сути этого OP здесь).   —  person msc    schedule 07.09.2018

См. также:  Расширение для Azure Devops и вывод

@Yunnosch: Я так понимаю, из многолетних воспоминаний о том, что я слышал, а не о том, с чем я работал лично.   —  person msc    schedule 07.09.2018

@Yunnosch Я думаю, что два верхних ответа в первом дупле говорят о разных указателях в одной системе, я что-то упускаю?   —  person msc    schedule 07.09.2018

@SouravGhosh Дай мне еще раз проверить. Как в рейтинге самых популярных?   —  person msc    schedule 07.09.2018

@Yunnosch Ах да, подсчет голосов.   —  person msc    schedule 07.09.2018

Ответ FryGy может быть равен 8, что отключено. (Вы, вероятно, имеете в виду не это …) В ответе Дэвида говорится об отсутствии гарантии на два размера указателя, я согласен. Но я чувствую, что это не делает этот вопрос здесь обманом, потому что этот вопрос в основном заключается в том, все ли указатели имеют размер 4? это гораздо более строгий вопрос, чем этот. В ответе есть деталь, которая отвечает и на этот вопрос здесь. Но, как я понимаю, дубликат заключается в том, что вы задаете тот же вопрос. с возможно воспринимаемым оттенком того, что вы могли бы найти сами. @SouravGhosh   —  person msc    schedule 07.09.2018

@SouravGhosh Я не имею в виду грубость с вашей стороны, просто чтобы прояснить это.   —  person msc    schedule 07.09.2018

@SouravGhosh Eclipse ответ такой же. Он в основном отвечает на этот вопрос. Но все же вопрос в корне другой, не так ли?   —  person msc    schedule 07.09.2018

@Yunnosch без обид. Пока я это делал, оба вопроса были вариантами, могут ли разные указатели иметь разный размер? — ну, ответ — да и нет — это зависит от компилятора — стандарт C не может об этом сказать,   —  person msc    schedule 07.09.2018

См. также:  Загрузка фикстур Symfony с помощью консольных команд

Давайте продолжим это обсуждение в чате.   —  person msc    schedule 07.09.2018

Я вижу аналогичную и уместную разницу между вопросами: Могут ли два человека быть разного цвета кожи? и Могут ли две человеческие сестры быть разного цвета кожи? Правильный ответ в обоих случаях — да. но чтобы дать такой ответ на второй вопрос, необходимы дополнительные рассуждения. Ответы на предложение обмана говорят об этом, но вопросы остаются другими. Оба вопроса представляют собой вариант ответа «Может ли человеческий цвет различаться?» @SouravGhosh   —  person msc    schedule 07.09.2018

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. msc

    Оба, sizeof(char*) и sizeof(double*) — размер указателя. Так что они, скорее всего, идентичны в любой вообразимой системе.

    Однако теоретически возможно, что реализация имеет разные методы для ссылки на разные типы данных. Я мог бы представить себе систему с небольшой схемой оптимизации памяти, выполняющей, например, однобайтовые простые старые данные в специальном месте с неявно «только» 32-битными указателями, в то время как он выполняет более крупные составные конструкции в большей области, для чего требуются 64-битные указатели.
    Таким образом, нет никакой гарантии этого, казалось бы, «очевидного» предположения .

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

  2. msc

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

    (a) Стандарт C не требует, чтобы указатели разных типов были одинакового размера. (b) Указатели на одно и то же место могут иметь разные представления, и результат печати указателей с %p определяется реализацией и не обязательно создает одну и ту же строку для всех указателей на одно и то же место. person msc; 07.09.2018

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: