Maison > développement back-end > C++ > Pourquoi ne puis-je pas attribuer un « void* » à un pointeur non vide en C, mais je peux le faire en C ?

Pourquoi ne puis-je pas attribuer un « void* » à un pointeur non vide en C, mais je peux le faire en C ?

Patricia Arquette
Libérer: 2024-10-31 11:22:29
original
321 Les gens l'ont consulté

  Why Can't I Assign a `void*` to a Non-Void Pointer in C  , But I Can in C?

Pointeurs vides : dévoiler le fossé entre C et C

En ce qui concerne les pointeurs vides, C et C présentent des comportements distincts. Le problème tourne autour de la possibilité d'attribuer des valeurs de retour void* à des pointeurs non vides.

En C, de telles affectations sont autorisées, comme l'illustre le code suivant qui se compile sans erreurs :

<code class="c">int* p = malloc(sizeof(int));</code>
Copier après la connexion

Cependant, en C , le même code ne parvient pas à se compiler, ce qui met en évidence la vérification de type plus stricte en C . Cet écart provient de la différence dans la façon dont les pointeurs void sont gérés.

Alors que C autorise les conversions implicites entre void et tout autre type de pointeur, C restreint cette liberté. En C , les conversions de void vers un type de pointeur spécifique nécessitent une conversion explicite. Ainsi, un transtypage est nécessaire pour que le code suivant soit compilé en C :

<code class="c++">int* p = (int*) malloc(sizeof(int));</code>
Copier après la connexion

Malgré cette différence, C autorise les conversions implicites de pointeurs non vides vers void*. Cette fonctionnalité est évidente dans le code suivant :

<code class="cpp">void foo(void* vptr) { }

int main() {
    int* p = (int*) malloc(sizeof(int));
    foo(p);
    return 0;
}</code>
Copier après la connexion

Ce code se compile sans problème en C et en C. La raison réside dans la flexibilité inhérente de void et la nature des pointeurs. Tout pointeur d'objet peut être converti en toute sécurité en void sans perdre d'informations. Lorsque le void* est reconverti dans son type de pointeur d'origine, le pointeur exact est restauré. Ceci est illustré par la citation de K&R2 :

"Tout pointeur vers un objet peut être converti en type void * sans perte d'informations. Si le résultat est reconverti au type de pointeur d'origine, le pointeur d'origine est récupéré ."

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal