14 votes

Est-il sûr de conserver un pointeur vers une variable hors de sa portée ?

Exemple de code :

#include <stdio.h>
int main (){
    int *p;
    {
        int v = 1;
        p = &v;
    }
    printf("%d\n", *p);
    return 0;
}

Ce code fonctionne bien, mais je ne suis pas sûr qu'il y ait une garantie que l'adresse de v sera préservée.

27voto

Merlyn Morgan-Graham Points 31815

Il n'y a pas de garantie.

Une fois v sort de son champ d'application, le fait de faire quoi que ce soit avec lui (même par le biais d'un pointeur) est considéré comme Comportement indéfini .

Comme pour tout autre comportement indéfini, ce n'est pas parce qu'il fonctionne sur un système d'exploitation, un compilateur, une version de compilateur, une heure de la journée, etc. qu'il fonctionnera pour un autre.

8voto

cdhowie Points 62253

Pour compléter la réponse de Merlyn, voici un cas où cela entraînerait probablement un comportement que vous n'aviez pas prévu :

#include <stdio.h>
int main (){
    int *p;
    {
        int v = 1;
        p = &v;
    }
    {
        int w = 2;
        printf("%d\n", w);
    }
    printf("%d\n", *p);
    return 0;
}

Le compilateur peut optimiser cela en ayant v y w partagent la même allocation sur la pile. Encore une fois, le compilateur peut ne pas optimiser cela - c'est pourquoi le comportement de l'utilisation de pointeurs vers des variables après la fin de leur bloc de fermeture n'est pas défini. Le programme peut produire "2" et "1", ou "2" et "2", ou "2" et quelque chose de complètement différent selon le compilateur et les paramètres utilisés.

0voto

Sree Ram Points 70

Oui, il fonctionne parfois, mais on ne peut pas être sûr qu'il fonctionne... Parfois, il ne provoque pas seulement une erreur de bus, mais aussi une erreur d'affichage. erreur de bus mais peut même faire planter tout le programme ...

Je vais vous donner un exemple

Jetez un coup d'oeil à ce http://www.functionx.com/cpp/examples/returnreference.htm

ici il essaie de retourner la référence d'une variable qui sort de la portée ...(grosse gaffe) ... mais cela fonctionne ....

Vous ne pouvez pas le garantir Il est donc préférable (pas le meilleur) de ne jamais renvoyer de référence à des données qui sortent du champ d'application

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X