2010-10-07 3 views
4

J'utilise MSVC et il semble que le code ci-dessous ne plante pas et le pointeur de fonction est initialisé à NULL par le compilateur.Les pointeurs de fonction seront-ils toujours initialisés à NULL?

int (*operate)(int a, int b); 
int add(int a, int b) 
{ 
    return a + b; 
} 

int subtract(int a, int b) 
{ 
    return a - b; 
} 

int main() 
{ 


    if(operate) //would crash here if not NULL 
    { 
     cout << operate(5,5); 
    } 

    operate = add; 
    if(operate) 
    { 
     cout << operate(5,5); 
    } 

    operate = subtract; 
    if(operate) 
    { 
     cout << operate(5,5); 
    } 
    return 0; 
} 

Il semble donc MSVC initialise des pointeurs de fonction NULL, mais si je construis cela sur gcc sous Linux serait-il aussi NULL? Est-ce que c'est conventionnel ou spécifique à MSVC, puis-je m'attendre à ce qu'il soit nul là où je vais?

Merci

+4

Faites du pointeur une variable locale et vous verrez que ce n'est pas le cas. Vous avez un global non initialisé et le compilateur le mettra généralement dans le segment ['.bss'] (http://en.wikipedia.org/wiki/.bss) qui est initialisé à zéro. –

+4

C ou C++, ce sont des langages différents. – GManNickG

+2

@Jeff: où le compilateur le met est sans importance. Il doit être initialisé à zéro s'il a une durée de stockage statique. –

Répondre

17

operate est initialisés à NULL, car il est une variable globale, non pas parce qu'il est un pointeur de fonction. Tous les objets avec une durée de stockage statique (qui inclut les variables globales, les variables static au niveau du fichier et les variables static dans les fonctions) sont initialisés à 0 ou NULL si aucun initialiseur n'est donné.

[EDIT en réponse au commentaire de Jim Buck:] En C++, cela est garanti par l'article 3.6.2/1 de la norme linguistique, qui commence:

objets avec la durée de stockage statique (3.7.1) doit être initialisé à zéro (8.5) avant toute autre initialisation . L'initialisation à zéro et l'initialisation avec une expression constante sont appelées collectivement initialisation statique; toutes les autres initialisation est dynamique initialisation.

Je suppose que le même comportement est vrai pour C, puisque C++ est conçu pour être compatible avec la plupart des choses, même si je n'ai pas le standard pour cela.

[EDIT # 2] Comme Jeff M souligne dans un commentaire, il est important de se rendre compte que les variables de durée de stockage automatique (qui est, « ordinaires » variables locales) sont pas automatiquement-initialisées à zéro: à moins que un initiateur est donné, ou un constructeur leur attribue des valeurs, ils contiennent initialement des ordures aléatoires (tout ce qui était déjà en mémoire à cet endroit). C'est donc une bonne habitude d'initialiser toutes les variables - cela ne peut pas nuire mais peut aider.

+0

Les variables globales/statiques ne sont pas garanties être initialisé à zéro. Ils pourraient dans une version de débogage, mais même ce n'est pas garanti. –

+6

@Jim: En effet, ils sont garantis en C++. Je vais ajouter une référence au paragraphe pertinent de la norme à mon poste. –

+0

Mon commentaire sur la question pourrait être pertinent. "Vous avez un global non initialisé et le compilateur le mettra généralement dans le segment [' .bss'] (http://en.wikipedia.org/wiki/.bss) qui est initialisé à zéro. " –

Questions connexes