СитуацияDe-Реферирование недействительным ошибка указателя, когда Infact уже ввергнуть
Рассмотрим следующий исходный код, который направлен на печать двух элементов а, т.е. выход должен быть «аа»:
#include <stdio.h>
int main()
{
char a = 'a';
void* a_pnt = &a;
void* b_pnt = (char*)a_pnt;
printf("%c", *(char*)a_pnt);
printf("%c", *b_pnt);// why is the compiler saying I am dereferencing a void pointer? It was already cast
return 0;
}
Усложнение
Печать первого «а» работает, но компилятор дает ошибку времени компиляции в строке 10 (вторая печать «а»):
Неправильное использование пустого выражения
и предупреждение на той же линии, говоря:
Разыменование Пустота * указатель
Хотя b_pnt действительно был объявлен void, он был привязан к указателю на символ в его определении в строке 7. Мое единственное предположение, почему его жалобы связаны с тем, что я могу только c ast при обращении в одно и то же время. Моя догадка основана на том, что первая переменная работает просто отлично.
Решение
Решения объявить и определить переменный характер под названием «б» и приведение к указателю символов авансом перед печатью:
#include <stdio.h>
int main()
{
char a = 'a';
void* a_pnt = &a;
void* b_pnt = a_pnt;
char b = *((char*)b_pnt);
printf("%c", *(char*)a_pnt);
printf("%c", b);// why is the compiler saying I am dereferencing a pointer?
return 0;
}
все еще остается вопрос: Почему начальным попытка провалилась?
Я намеренно начинаю с указателя void, чтобы проиллюстрировать проблему. Этого действительно можно было избежать полностью с правильным типом указателя.
Почему 'void *', но не 'char * b_pnt = a_pnt'? – ensc
'(cast) expr' не влияет на тип' expr'. Это влияет только на тип '(cast) expr'. – EOF
@ensc Я намеренно начинаю с указателя void, чтобы проиллюстрировать проблему. Этого действительно можно было избежать полностью –