2017-07-06 3 views
-1

C'est un extrait de mon code c++:tampon est utilisé, mais peut ne pas avoir été initialisé (en studio visuel)

char buff[512]; 
memset(buff, ' ', sizeof(buff)); 
GetModuleFileName(NULL, buff, _MAX_PATH); 
char *file = strrchr(buff, '.'); 

Il semble buff est initialisé dans la première ligne. Mais je reçois ce du studio visuel (Ceci est un avertissement, pas une erreur, je veux supprimer cet avertissement):

'buff' is not initialized 
'buff' is used, but may not have been initialized 

Quel est le problème?

+3

Comment avez-vous déclaré 'buff'? – user0042

+0

'Il semble que le buff est initialisé dans la première ligne' Non ce n'est pas le cas. Est-ce que buff est un pointeur ou un tableau? Si c'est un pointeur, avez-vous alloué de l'espace pour cela - ex. avec 'nouveau'? –

+0

L'initialisation a lieu au point de déclaration. –

Répondre

2

Il semble que vous utilisez un pointeur char* simple pour buff comme ceci:

char* buff; 

au lieu de

char buff[_MAX_PATH]; 

memset() ne sera pas allouer de la mémoire pour le pointeur de la mémoire tampon.


Sinon, vous pouvez également utiliser un pointeur initialisé:

char* buff = new[_MAX_PATH]; 

Mais ne pas oublier d'appeler

delete [] buff; 

alors, et que sizeof() vous ne donnera pas la taille le tableau alloué mais seulement la taille de la variable pointeur elle-même.

La même meilleure alternative serait d'utiliser un std::vector<char> à la place:

std::vector<char> buff(_MAX_PATH,'\0'); 

Vous devez changer un peu plus de code pour l'utiliser correctement si:

GetModuleFileName(NULL, buff.data(), _MAX_PATH); 
char *file = strrchr(buff.data(), '.'); 

Aussi, vous devez initialiser votre tampon avec des caractères NUL plutôt que des blancs (' '):

memset(buff, '\0', sizeof(buff)); 
      // ^^ 
+0

"Mais n'oubliez pas d'appeler ' delete [] buff; '" - ou utilisez simplement un pointeur "std :: vector'" ou intelligent et oubliez de devoir effectuer un nettoyage manuel. –

+0

@Jesper Bien sûr, ce serait les meilleures alternatives, mais ont besoin de plus de changements au code OP, bien sûr. – user0042

+0

Je viens de croire qu'une bonne réponse devrait mentionner de meilleures alternatives quand elles existent :) une réponse est l'occasion parfaite d'éduquer. –