2017-10-06 21 views
-1

J'ai trouvé un extrait de code où un pointeur char (par exemple * pData) est déclaré sans être initialisé à NULL.Affectation de valeur au pointeur non initialisé AVANT de déréférencer

char *pData, *pData2; 
char string[10] = "Hello" 
pData2 = &string[0]; 
SomeFuntionToAssignValue(pData2, &pData); 

SomeFuntionToAssignValue(char *pData2, char **pData) 
{ 
    if (something) 
    { 
     *pData = pData2; 
    } 
    else if (something) 
    { 
     *pData = &pData2[some calculation] 
    } 
} 

peut déréférencement pData, après avoir appelé SomeFuntionToAssignValue fonction(), à tout moment lancer une erreur « exception d'accès mémoire »? Parce que pendant la compilation ou le test local (ici le test est effectué dans des cibles qui peuvent être rechargées à tout moment, donc les risques de corruption de la mémoire diminuent), nous n'avons pas rencontré d'erreur "memory access exception".

Mais au cours des essais dans l'environnement sur le terrain, où la cible n'a pas été rechargées pendant au moins le temps d'une semaine, une erreur « d'exception d'accès mémoire » a été lancée.

Alors, est-il possible que ne pas faire char *pData = NULL aurait pu provoquer l'erreur « d'exception d'accès mémoire »?

+0

C ne possède pas d '"exceptions d'accès à la mémoire" sauf si vous spécifiez une plateforme, une architecture et un compilateur. –

+0

Appelez votre fonction comme vous le montrez, il sera prudent d'utiliser 'pData' après l'appel. –

+1

@Someprogrammerdude - Safe si 'certains donnent calculation' résultat dans la gamme [0, strlen (pData2)] –

Répondre

0

Oui, il y a une chance, parce que votre SomeFuntionToAssignValue ne le fait pas toujours attribuons à *pData. Et l'initialisation pData pour être nul pourrait éviter un problème parce que l'autre code pourrait vérifier NULL mais ne peut pas vérifier sa valeur non initialisée. Mais tout dépend du code que vous n'avez pas montré; il n'y a rien de mal avec ce modèle en général.