Я думаю, вы хотите использовать void * ptr
в качестве общего указателя на любые типы данных. Проблема в вашем коде, как показано ниже.
int main()
{
char prenume[] = "Alexandru";
char* name = prenume;
int age = 33;
float height = 1.81; //<=== this line will cause a truncation warning at compile time
void* ptr;
ptr = name;
printf("My name is %s", *((char*)ptr)); // <======= this line will cause access violation error at runtime
ptr = &age;
printf("\nAge:%d", *((int*)ptr));
ptr = &height;
printf("\nHeight:%2.2f", *((float*)ptr));
return 0;
}
Вы должны использовать ((char*)ptr)
(удалить ведущий *
). Это выражение разрешается по адресу из A
. Поскольку %s
ожидает начальный адрес строки.
Если вы используете *((char*)ptr)
, он преобразуется в значение char A
. Значение ASCII A
равно 0x41
, это не тот адрес, к которому вы обычно можете получить доступ. А ниже отладочное сообщение показывает, что именно адрес 0x41
вызывает нарушение прав доступа.
После внесения вышеуказанных изменений ваш код может работать, как показано ниже :
И, кстати, C опасная красота ...