#c
#c
Вопрос:
int getNumber(){
int number;
cin >> number;
return number;
}
const void * getPointer(){
const void *p = (const void *)getNumber();
return p;
}
Выдает ошибку:
предупреждение: приведение к указателю из целого числа разного размера
и консоль вылетает
Комментарии:
1.
int
вероятно, в вашей системе 4 байта, аvoid*
8 байт. Вместо этого используйтеintptr_t
или,uintptr_t
чтобы гарантировать размер указателя.2. Почему вы хотите «привести целое число к постоянному указателю void», точно?
3. @SamVarshavchik Я хочу передать его в качестве аргумента функции, которая может выполнять сумму двух целых чисел, а также может выполнять сумму двух точек
4. Сумма двух указателей? Это незаконно в C / C и не имеет никакого смысла.
5. @bloody Я использую перегрузку в данный момент времени
Ответ №1:
Как преобразовать целое число в постоянный указатель void?
Начните с целочисленного типа, который достаточно широк, чтобы представлять все значения указателя. std::intptr_t
это такой тип. Если вы хотите преобразовать из более узкого типа, вы можете сначала преобразовать его в более широкий тип. Затем используйте reinterpret_cast .
и консоль вылетает
Показанная программа не является причиной этого сбоя.
Обратите внимание, что преобразование целого числа в указатель — это продвинутый метод, который редко требуется. Если вы новичок, то, скорее всего, столкнулись с проблемой XY.
Ответ №2:
getNumber() возвращает копию. Вы преобразуете копию в указатель. (Существует разница между копией и адресом копии, которым должен быть указатель)
int nb = getNumber();
const void *cp_void = (const void *)nb; // this will not yield the expected result.
int *p_nb = amp;nb; // memory adress to variable .. but variable will go out of scope
Как следует из комментариев, просто динамическое выделение int не является ответом, и, скорее всего, существует недостаток дизайна (в коде не показан).
Двух показанных фрагментов getNumber() и getPointer() недостаточно, чтобы прокомментировать или улучшить остальную часть программы.
Комментарии:
1. Показанная программа не принимает ни ссылку, ни указатель на временный объект.
2. я не уверен, что тогда мы смотрим на одно и то же — первая строка в getPointer() . .вызывает функцию getNumber(), которая возвращает временное значение, которое выйдет из области видимости после завершения функции, и поэтому «адрес памяти» больше не будет доступен .. возможно, я ошибаюсьхотя
3. @eerorika
int getNumber(){ int *number = new int; *number = 10;return number;}
это работает так4. @ОШИБКА Имейте в виду при выполнении динамического выделения (new) .. ваши объекты не будут освобождены, пока вы явно не удалите их сами .. и поэтому они считаются утечками памяти.. это также является причиной того, что современный cpp выступает за использование интеллектуальных указателей вместо необработанных указателей.
5. @ОШИБКА Программа в вашем комментарии неправильно сформирована. Кроме того, он не преобразует int в указатель, а скорее преобразует указатель в int, что противоположно тому, о чем вы спрашивали.