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>
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>
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>
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!