2017-01-17 15 views
1

У меня есть код, в котором закидывающих целое структурировать указатель бросает предупреждение на НКУ (Linux)Как действует это бросить целое структурировать

typedef struct st { 
    int a; 
    char *b; 
}st; 
... 
int handle; 

int main() { 
... 
st *sptr = (st*)handle; 
... 
} 

Согласно C11 спецификации

целое число может быть преобразовано в любой тип указателя. За исключением, как указано ранее, результат определен в соответствии с реализацией, может быть не правильно выровнен, может не указывать на объект ссылочного типа и может быть ловушечным представлением.

Мой вопрос: Можем ли мы наложить целое число на указатель структуры, или мы должны искать другие способы и сохранять это в качестве крайней меры?

+1

Просьба включить фактическое предупреждение. Вероятно, предупреждение говорит, что int и указатель имеют разный размер, что важно здесь. –

+0

Помните, что указатель в основном представляет собой целое число, которое является адресом в памяти, куда указывает указатель. То, что делает бросок, - это значение «handle» и использование этого в качестве адреса указателя для указания. Это не редкость делать на встроенных системах с фиксированными адресами памяти. –

+9

Почему вы хотите сделать такой актерский состав? На вашей платформе 'int', вероятно, меньше указателя. Если вам абсолютно необходимо что-то подобное, используйте 'intptr_t' вместо' int'. –

ответ

1

Есть две вещи, чтобы рассмотреть следующие вопросы:

  • Это не может быть возможным, чтобы представить результат. int может не иметь того же представления, что и тип указателя для данной платформы. Вот почему uintptr_t существует для таких случаев. uintptr_t handle; сделает ваш код переносимым.

  • Целочисленное значение должно быть чем-то, что можно интерпретировать как выровненный адрес для данной системы.

 Смежные вопросы

  • Нет связанных вопросов^_^