История изменений
Исправление LamerOk, (текущая версия) :
Стандарт говорит только то, что указатель можно преобразовать в uintptr_t и обратно, и получится тот же указатель. Я так понимаю, это в основном нужно для сериализации.
Вообще-то, нет. Это нужно для взаимооднозначного соответствия всего возможного множества указателей некоторому множеству неотрицательных (или просто целых в случае с intptr_t
) чисел.
Что именно делать с этим соответствием - вопрос десятый, но ключевое тут то, что над множеством чисел возможны произвольные арифметические операции. Сериализация тут вообще никак не участвует и ничто не мешает сериализовать указатели любым другим способом.
Поэтому тут смысла не очень много спрашивать что-то по стандарту С. Ты задаёшь вопрос и потом тебе ещё надо целый день объяснять всем по кругу, что такое стандарт С, и почему их очевидный вариант в этот стандарт не вписывается.
Вот только это не связано с "программистами", а связано с самим языком си и его стандартом. Обсуждалось уже 100500 раз, можно ещё в 100501-ый - стандарт не написан для программистов, стандарт написан для разработчиков компиляторов как наибольший общий делитель всего того, что реализовано в разных компиляторах.
Конкретно под GNU/Linux + gcc английским в ASCII сказано:
The C standard says the two pointers must point within the same object in memory, but on GNU/Linux systems these operations simply compare the numeric values of the pointers.
Исправление LamerOk, :
Стандарт говорит только то, что указатель можно преобразовать в uintptr_t и обратно, и получится тот же указатель. Я так понимаю, это в основном нужно для сериализации.
Вообще-то, нет. Это нужно для взаимооднозначного соответствия всего возможного множества указателей некоторому множеству неотрицательных чисел.
Что именно делать с этим соответствием - вопрос десятый, но ключевое тут то, что над множеством чисел возможны произвольные арифметические операции. Сериализация тут вообще никак не участвует и ничто не мешает сериализовать указатели любым другим способом.
Поэтому тут смысла не очень много спрашивать что-то по стандарту С. Ты задаёшь вопрос и потом тебе ещё надо целый день объяснять всем по кругу, что такое стандарт С, и почему их очевидный вариант в этот стандарт не вписывается.
Вот только это не связано с "программистами", а связано с самим языком си и его стандартом. Обсуждалось уже 100500 раз, можно ещё в 100501-ый - стандарт не написан для программистов, стандарт написан для разработчиков компиляторов как наибольший общий делитель всего того, что реализовано в разных компиляторах.
Конкретно под GNU/Linux + gcc английским в ASCII сказано:
The C standard says the two pointers must point within the same object in memory, but on GNU/Linux systems these operations simply compare the numeric values of the pointers.
Исходная версия LamerOk, :
Стандарт говорит только то, что указатель можно преобразовать в uintptr_t и обратно, и получится тот же указатель. Я так понимаю, это в основном нужно для сериализации.
Вообще-то, нет. Это нужно для взаимооднозначного соответствия всего возможного множества указателей некоторому множеству неотрицательных чисел.
Что именно делать с этим соответствием - вопрос десятый, но ключевое тут то, что над множеством чисел возможны произвольные арифметические операции. Сериализация тут вообще никак не участвует и ничто не мешает сериализовать указатели любым другим способом.
Поэтому тут смысла не очень много спрашивать что-то по стандарту С. Ты задаёшь вопрос и потом тебе ещё надо целый день объяснять всем по кругу, что такое стандарт С, и почему их очевидный вариант в этот стандарт не вписывается.
Вот только это не связано с "программистами", а связано с самим языком си и его стандартом. Обсуждалось уже 100500 раз, можно ещё в 100501-ый - стандарт не написан не для программистов, стандарт написан для разработчиков компиляторов как наибольший общий делитель всего того, что реализовано в разных компиляторах.
Конкретно под GNU/Linux + gcc английским в ASCII сказано:
The C standard says the two pointers must point within the same object in memory, but on GNU/Linux systems these operations simply compare the numeric values of the pointers.