Указатель на взаимное преобразование указателя - PullRequest
2 голосов
/ 02 октября 2010

Безопасно ли преобразовывать int pointer в void pointer и затем обратно в int pointer?

main()
{
    ...
    int *a = malloc(sizeof(int));
    ...
    *a=10;
    func(a);
    ...
}

void func(void *v)
{
    int x=*(int *)v;
    ...
}

Является ли это верным способом получения целочисленного значения обратно в функцию?

Ответы [ 2 ]

6 голосов
/ 02 октября 2010

Да, это безопасно.Стандарт говорит об этом (6.3.2.3/1)

Указатель на void может быть преобразован в или из указателя на любой неполный или тип объекта.Указатель на любой неполный или тип объекта может быть преобразован в указатель на void и обратно;результат должен сравниться с исходным указателем.

5 голосов
/ 02 октября 2010

Это "безопасно", поскольку указатель, полученный в результате преобразования int => void => int, будет таким же, как и исходный указатель.

Это не «безопасно», поскольку легко ошибиться, и вы должны быть осторожны (тем не менее, этот тип кода часто необходим в C, так как void* часто используется как формаобобщение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...