Понимание указателей Void: различия между C и C
Указатели Void являются ключевым аспектом как C, так и C , но есть заметные различия в их обращении. В этой статье рассматриваются эти различия и объясняется, почему может возникнуть, казалось бы, противоречивое поведение.
Неявные преобразования в C
В C — преобразования между указателями на определенный тип (например, int) и указатель void (void) всегда неявны. Это означает, что справедливо следующее утверждение:
int* p = malloc(sizeof(int));
Функция malloc возвращает void*, который затем присваивается указатель int*. Однако в C такие неявные преобразования не разрешены.
Явное приведение типов в C
В C преобразование из указателя в указатель void по-прежнему выполняется неявно, но преобразование указателя void в определенный тип требует явного приведения. Это объясняет, почему следующий код компилируется как на C, так и на C:
void foo(void* vptr)
{
}
int main()
{
int* p = (int*) malloc(sizeof(int));
foo(p);
return 0;
}
Функция malloc возвращает void*, который передается функции foo. Несмотря на то, что указатель int* присвоен параметру void*, C допускает это неявное преобразование. Однако последующий вызов p требует явного приведения к типу int*.
Перспектива стандарта
Согласно спецификации K&R2, любой указатель на объект может быть безопасно преобразованы в void* без потери информации. Более того, преобразование обратно в исходный тип указателя восстанавливает исходное значение. В C стандарт определяет, что неявные преобразования любого типа указателя в void* разрешены, но для преобразований из void* в любой другой тип необходимо явное приведение.
Заключение
Ключевое различие между обработкой указателя void* в C и C заключается в необходимости явного приведения типов при преобразовании из void* в определенный тип в C . Этот более строгий подход помогает предотвратить неопределенное поведение и обеспечивает безопасность типов в коде C.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3