История изменений
Исправление vbr, (текущая версия) :
Стандарт C ничего не говорит о структуре uintptr_t
. И даже не гарантирует его наличия в принципе, это опциональный тип. Ты пытаешься использовать младший бит, предполагая, что он неиспользуемый. Но стандарт не даёт никаких оснований для таких предположений.
Всё, что гарантирует стандарт - что ты можешь преобразовать указатель в uintptr_t
и обратно. И результат будет равен исходному указателю. Больше никаких гарантий нет. Причём обратное не гарантируется: если один указатель равен другому, то совсем не обязательно, что каст в uintptr_t
для этих указателей даст равные значения.
void *p1 = get_p();
uintptr_t u = (uintptr_t) p1;
void *p2 = (void *) u;
if (p1 != p2) {
// This cannot be!
}
void *p1 = get_p1();
void *p2 = get_p2();
uintptr_t u1 = (uintptr_t) p1;
uintptr_t u2 = (uintptr_t) p2;
if (p1 == p2 && u1 != u2) {
// This can be!
}
Исправление vbr, :
Стандарт C ничего не говорит о структуре uintptr_t
. И даже не гарантирует его наличия в принципе, это опциональный тип. Ты пытаешься использовать младший бит, предполагая, что он неиспользуемый. Но стандарт не даёт никаких оснований для таких предположений.
Всё, что гарантирует стандарт - что ты можешь преобразовать указатель в uintptr_t
и обратно. И результат будет равен исходному указателю. Больше никаких гарантий нет. Причём обратное не гарантируется: если один указатель равен другому, то совсем не обязательно, что каст в uintptr_t
для этих указателей даст равные значения.
void *p1 = get_p();
uintptr_t u = (uintptr_t) p1;
void *p2 = (void *) u;
if (p1 != p2) {
// This cannot be!
}
void *p1 = get_p();
void *p2 = get_p();
uintptr_t u1 = (uintptr_t) p1;
uintptr_t u2 = (uintptr_t) p2;
if (p1 == p2 && u1 != u2) {
// This can be!
}
Исправление vbr, :
Стандарт C ничего не говорит о структуре uintptr_t
. И даже не гарантирует его наличия в принципе, это опциональный тип. Ты пытаешься использовать младший бит, предполагая, что он неиспользуемый. Но стандарт не даёт никаких оснований для таких предположений.
Всё, что гарантирует стандарт - что ты можешь преобразовать указатель в uintptr_t
и обратно. И результат будет равен исходному указателю. Больше никаких гарантий нет. Причём обратное не гарантируется: если один указатель равен другому, то совсем не обязательно, что каст в uintptr_t
для этих указателей даст равные значения.
Исправление vbr, :
Стандарт C ничего не говорит о структуре uintptr_t
. И даже не гарантирует его наличия в принципе, это опциональный тип. Ты пытаешься использовать младший бит, предполагая, что он неиспользуемый. Но стандарт не даёт никаких оснований для таких предположений.
Всё, что гарантирует стандарт - что ты можешь преобразовать указатель в uintptr_t
и обратно. И результат будет равен исходному указателю. Больше никаких гарантий нет.
Исправление vbr, :
Стандарт C ничего не говорит о структуре uintptr_t
. И даже не гарантирует его наличия в принципе, это опциональный тип. Ты пытаешься использовать младший бит, предполагая, что он неиспользуемый. Но стандарт не даёт никаких оснований для таких предположений.
Всё, что гарантирует стандарт - что ты можешь преобразовать указатель в uintptr_t
и обратно. И получить тот же самый указатель. Больше никаких гарантий нет.
Исправление vbr, :
Стандарт C ничего не говорит о структуре uintptr_t
. И даже не гарантирует его наличия в принципе, это опциональный тип. Ты пытаешься использовать младший бит, предполагая, что он неиспользуемый. Но стандарт не даёт никаких оснований для таких предположений.
Исходная версия vbr, :
Стандарт C ничего не говорит о структуре uintptr_t
. И даже не гарантирует его наличия в принципе, это опциональный тип. Ты пытаешься использовать младший бит, предполагая, что он неиспользуемый. Но стандарт не даёт никаких гарантий по этому поводу.