@Zuoya

Как правильно привести тип void* к int?

Ошибка с приведением типа int* к void* и затем снова void* к int*
int main(int argc, char const *argv[])
{
    int *ints = calloc(10,sizeof(int));
    void *v = NULL;
    for (int i = 0; i <10; i++)
        ints[i] = i;
    v = ints;
    for (int i = 0; i< 10; i++)
        printf("%d,",*(int*)&v[i]);    
    printf("\n");    
}

Вместо цифр от 0 до 9 получаю
0,16777216,65536,256,1,33554432,131072,512,2,50331648,
и откуда взялись - 16777216,65536,256 ?
  • Вопрос задан
  • 692 просмотра
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Размер void стандартом не определён, поэтому поведение операций инкремента/декремента и индекса для указателя типа void* также не определено и зависит от компилятора.
В вашем случае компилятор принял размер void за 1 байт, поэтому v[i] работает с шагом в 1 байт.
ints[i] работает с шагом sizeof(int) байт, то есть 2, 4 или 8 байт, в зависимости от компилятора и целевой системы.
Некоторые компиляторы просто выдадут ошибку при таком использовании указателя с типом void*.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы